0

这是困扰我的事情,我有 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. 从站有另一个主(子),然后可以有从站列表;

这里有对应的数据映射类,

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”为空,“ChildMasterId”为空 guid。

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

4

2 回答 2

0

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

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

于 2015-04-22T23:48:05.187 回答
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");
    }
于 2015-04-22T02:13:56.853 回答