【问题标题】:Entity Framework Fluent API configuration实体框架 Fluent API 配置
【发布时间】:2015-04-23 07:48:05
【问题描述】:

这是困扰我的事情, 我有 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 拥有 Slave 列表;
  2. Slave 应该属于 Master(Parent);
  3. Slave 有另一个 Master(Child),然后可以拥有 Slave 列表;

对应的数据映射类来了,

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 和它的 slaves 都被插入到表中,childmaster(s) 也被插入了,但是它们没有与 topMaster 的 Slaves 关联,这意味着 'ChildMaster' 为 null 并且 'ChildMasterId' 为空 guid。

我不知道数据映射类有什么问题会导致这个问题。

【问题讨论】:

    标签: entity-framework ef-fluent-api


    【解决方案1】:

    /*

    在流畅的实体一对一映射与两侧导航的情况下,您不能明确地自定义外键名称。至少在 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");
        }
    

    【讨论】:

    • 请允许我稍微澄清一下。它是EF 6.x,所以可以做到。源代码可以毫无问题地编译。它也可以从头到尾运行。它还通过了 EF 的数据模型验证。唯一的问题是无法建立 'ChildMaster' 和 'Slave' 之间的关联。
    • 我尽量不将属性应用到我的 POCO,但如果找不到其他解决方案,我会尝试。
    【解决方案2】:

    好的,伙计们,我想出了解决方案。 这纯粹是我的错,我忘记在'ParentMaster'和'ChildMaster'之前添加'virtual'。

    因为关联行为“与创建动态代理的 EntityObject 和 POCO 有关”。 --- Julia Lerman 的 [Programming Entity Framework,第 19 章]。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      • 2014-08-04
      • 1970-01-01
      相关资源
      最近更新 更多