簡體   English   中英

實體框架Fluent API配置

[英]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; }
}

基本上,

  1. 主人有奴隸名單;
  2. 奴隸應屬於主人(父母);
  3. 從站有另一個Master(Child),然后可以具有從站列表;

這里是對應的數據映射類,

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM