Hello,
here is a short but complete example of adding and removing fields dynamically.
There are no limitations for DB however if you're going to change your model you'll need to perform a regular upgrade over the database.
Unfortunately due to techinal limitations dynamic fields are not fully usable in LINQ unless there is a real property defined for the field in question.
using System;
using System.Linq;
using Xtensive.Orm;
using Xtensive.Orm.Building;
using Xtensive.Orm.Building.Definitions;
using Xtensive.Orm.Configuration;
namespace DynamicEntitySample
{
[HierarchyRoot]
public class DynamicEntity : Entity
{
[Key, Field]
public long Id { get; private set; }
[Field]
public string FieldToRemove { get; set; }
public DynamicEntity(Session session)
: base(session)
{
}
}
public class MyModule : Module
{
public override void OnDefinitionsBuilt(BuildingContext context, DomainModelDef model)
{
// Removing existing field
var dynamicEntityType = model.Types[typeof (DynamicEntity)];
var fieldToRemove = dynamicEntityType.Fields["FieldToRemove"];
dynamicEntityType.Fields.Remove(fieldToRemove);
// Adding new field
dynamicEntityType.DefineField("FieldToAdd", typeof (string));
}
}
internal static class Program
{
private static void Main(string[] args)
{
var configuration = new DomainConfiguration("sqlserver",
"Data Source=localhost;Initial Catalog=DO-Tests;Integrated Security=True;MultipleActiveResultSets=True");
configuration.UpgradeMode = DomainUpgradeMode.Recreate;
configuration.Types.Register(typeof (DynamicEntity).Assembly);
var domain = Domain.Build(configuration);
using (var session = domain.OpenSession())
using (var tx = session.OpenTransaction()) {
var entity = new DynamicEntity(session);
// Setting dynamic field value
entity["FieldToAdd"] = "Hello dynamic world!";
tx.Complete();
}
using (var session = domain.OpenSession())
using (var tx = session.OpenTransaction()) {
var entity = session.Query.All<DynamicEntity>().Single();
// Reading dynamic field value
Console.WriteLine(entity["FieldToAdd"]);
tx.Complete();
}
}
}
}
answered
Feb 20 '14 at 04:39
Denis Krjuchkov
1793●2●5