如何将对象模型的一部分映射到实体框架和SQL Server中的XML列?

时间:2013-12-05 15:04:37

标签: sql-server xml entity-framework

我是Entity Framework的新手,我正在努力找出一个有点复杂的映射。这是我的对象:

public class Parent
{
    public virtual Guid Id {get;set;}
    public virtual string Description {get;set;}
    public virtual Child Child {get;set;}
}

public class Child
{
    public virtual Guid Id {get;set;}
    public virtual string Description {get;set;}
}

这是数据库架构:

CREATE TABLE [Parent](
[Id] [uniqueidentifier] NOT NULL PRIMARY_KEY,
[Description] [nvarchar](50) NULL,
[Child] [xml] NULL

因此Parent表上的Child列包含Child对象的序列化版本。如果更改了Child对象,则在保存Parent对象时需要更新它。它是懒惰加载还不是必不可少的,但可能在将来。

我知道NHibernate使用IUserType可以做到这一点,但我还没想到如何使用Entity Framework做到这一点。

1 个答案:

答案 0 :(得分:0)

唯一的方法是让Parent对象拥有Xml数据字段。然后,在我的类中重写DbContext,我重写以下方法并处理以下事件:

public class Context : DbContext
{
    public ObjectContext ObjectContext
    {
        get { return ((IObjectContextAdapter)this).ObjectContext; }
    }

    private void InterceptBefore(ObjectStateEntry item)
    {
        var parent = item.Entity as Parent;

        if (parent!= null)
            parent.XmlData = XmlObjectSerializer.Serialize(applicationForm.Child);
    }

    public override int SaveChanges()
    {
        const EntityState entitiesToTrack = EntityState.Added | EntityState.Modified | EntityState.Deleted;

        var elementsToSave =
            this.ObjectContext
                .ObjectStateManager
                .GetObjectStateEntries(entitiesToTrack)
                .ToList();

        elementsToSave.ForEach(InterceptBefore);
        var result = base.SaveChanges();
        return result;
    }

    public void ObjectContext_ObjectMaterialized(object sender, ObjectMaterializedEventArgs e)
    {
        var parent = e.Entity as Parent;

        if (parent != null)
            parent.Child = XmlObjectSerializer.Deserialize<Child>(applicationForm.XmlData);
    }
}