我是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做到这一点。
答案 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);
}
}