实体框架Fluent API配置

时间:2015-04-21 23:17:38

标签: entity-framework ef-fluent-api

这是困扰我的事情, 我有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. Master有Slaves列表;
  2. 奴隶应属于主人(父母);
  3. 奴隶有另一个主人(孩子),然后可以有奴隶名单;
  4. 这里有相应的数据映射类,

    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及其奴隶都已插入表格中,也插入了童工,但他们没有与topMaster的奴隶联系,这意味着&#39; ChildMaster&#39;是空的&#39; ChildMasterId&#39;是空的guid。

    我不知道导致此问题的数据映射类有什么问题。

2 个答案:

答案 0 :(得分: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");
    }

答案 1 :(得分:0)

好的,伙计们,我找出了解决方案。 那纯粹是我的错,我忘记添加虚拟&#39;之前&#39; ParentMaster&#39;和&#39; ChildMaster&#39;。

因为关联行为与创建动态代理的EntityObject和POCO有关。&#39; --- Julia Lerman的[编程实体框架,第19章]。