[英]Entity Framework Fluent API configuration
这是困扰我的事情,我有2个实体-“ Master”和“ Slave”,让我首先列出它们:
public class Master
{
public Guid Id {get;set;}
public virtual ICollection<Slave> Slaves { get; set; }
public virtual Slave ParentSlave { get; set; }
}
class Slave
{
public Guid Id { get; set; }
public Guid ParentMasterId { get; set; }
public Master ParentMaster { get; set; }
public Guid? ChildMasterId { get; set; }
public Master ChildMaster { get; set; }
}
基本上,
这里是对应的数据映射类,
class MasterDataMap : EntityTypeConfiguration<Master>
{
public MasterDataMap()
{
HasKey(i => i.Id);
HasOptional(o => o.ParentSlave).WithRequired(o=>o.ChildMaster);
ToTable("Master");
}
}
class SlaveDataMap : EntityTypeConfiguration<Slave>
{
public SlaveDataMap()
{
HasKey(i => i.Id);
HasRequired(o => o.ParentMaster).WithMany(m => m.Slaves).HasForeignKey(k=>k.ParentMasterId).WillCascadeOnDelete(true);
HasRequired(o => o.ChildMaster).WithOptional(d => d.ParentSlave);
ToTable("Slave");
}
}
这两个实体可以顺利通过EF模型验证,并且在运行以下代码后,可以在端到端测试期间成功创建表,
for (var idx = x; idx <= xx; idx++)
{
topMaster.Slaves.Add(new Slave
{
Id = Guid.NewGuid(),
ChildMaster = new Master
{
Id = Guid.NewGuid(),
}
});
}
topMaster及其从属设备均已插入表中,还插入了childmaster,但它们未与topMaster的从属设备相关联,这意味着'ChildMaster'为null,而'ChildMasterId'为空guid。
我不知道导致此问题的数据映射类有什么问题。
/ *
如果使用带有双向导航的流畅的实体一对一映射,则不能显式拥有自定义外键名称。 至少在EF 5.0版之前,我不知道一种方法。 我知道我们可以轻松地使用属性方式做到这一点 。
* /
public class Master
{
public Guid Id {get;set;}
public virtual ICollection<Slave> Slaves { get; set; }
public virtual Slave ParentSlave { get; set; }
}
class Slave
{
public Guid Id { get; set; }
public Guid ParentMasterId { get; set; }
public Master ParentMaster { get; set; }
public Master ChildMaster { get; set; }
}
class MasterDataMap : EntityTypeConfiguration<Master>
{
public MasterDataMap()
{
HasKey(i => i.Id);
//HasOptional(o => o.ParentSlave).WithRequired(o=>o.ChildMaster);
ToTable("Master");
}
}
class SlaveDataMap : EntityTypeConfiguration<Slave>
{
public SlaveDataMap()
{
HasKey(i => i.Id);
HasRequired(o => o.ParentMaster).WithMany(m => m.Slaves).HasForeignKey(k=>k.ParentMasterId).WillCascadeOnDelete(true);
HasRequired(o => o.ChildMaster).WithOptional(d => d.ParentSlave);
ToTable("Slave");
}
好的,伙计们,我想出了解决方案。 纯粹是我的错,我忘记在“ ParentMaster”和“ ChildMaster”之前添加“ virtual”。
因为关联行为“与创建动态代理的EntityObject和POCO有关”。 ---朱莉娅·莱曼(Julia Lerman)的[编程实体框架,第19章]。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.