这是困扰我的事情,我有 2 个实体---"主"和"从",让我先列出它们:
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的Slaves相关联,这意味着"ChildMaster"为空,"ChildMasterId"为空。
我不知道数据映射类有什么问题导致这个问题。
/*
在具有两侧导航的流畅实体一对一映射的情况下,不能显式使用自定义外键名称。至少在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");
}
<</div>
div class="one_answers"> 好的,伙计们,我想出了解决方案。这纯粹是我的错,我忘了在"家长大师"和"儿童大师"之前添加"虚拟"。
因为关联行为"与创建 dyanmic 代理的 EntityObject 和 POCO 有关"--- Julia Lerman 的 [编程实体框架,第 19 章]。