[英]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.