2015-04-21 25 views
0

這裏是東西纏着我, 我有2個實體---「大師」和「奴隸」,讓我先列出來:實體框架流利API配置

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; } 
} 

基本上,

  1. 主人有奴隸名單;
  2. 奴隸應屬於主(父母);
  3. 奴隸有另一個主人(孩子),然後可以有奴隸列表;

這裏談到相應的數據映射類,

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"); 
    } 
} 

這些2層的實體可以通過EF模型驗證沒有任何問題,和表可以成功地端至端測試期間被創建,運行以下後碼,

for (var idx = x; idx <= xx; idx++) 
{ 
    topMaster.Slaves.Add(new Slave 
         { 
          Id = Guid.NewGuid(), 
          ChildMaster = new Master 
              { 
               Id = Guid.NewGuid(), 
              } 
         }); 
} 

topMaster和奴隸都被插入到表中,childmaster(S)也被插入,但他們並沒有與topMaster的奴僕相關,這意味着「childMaster」是NUL l和'ChildMasterId'是空的guid。

我不知道數據映射類導致此問題的問題。

回答

0

/*

用流利的實體一到一對一的映射與兩側導航的情況下,你不能自定義的外鍵的名稱明確。至少我不知道一種方法,直到版本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"); 
    } 
+0

請允許我澄清一點。它是EF 6.x,所以可以完成。源代碼可以毫無問題地編譯。它也可以從頭到尾運行。它也通過了EF的數據模型驗證。唯一的問題是'ChildMaster'和'Slave'之間的關聯無法建立。 – wxdtony

+0

你有沒有嘗試上面的代碼。 – pjobs

+0

我嘗試不將屬性應用於我的POCO,但如果找不到其他解決方案,我會嘗試使用它。 – wxdtony

0

好吧,夥計們,我找出解決方案。 這純粹是我的錯,我忘了在'ParentMaster'和'ChildMaster'之前添加'虛擬'。

因爲關聯行爲屬於創建dyanmic代理的EntityObject和POCO。 --- Julia Lerman的[編程實體框架,第19章]。