如何将新实体同时附加到单个属性和列表

时间:2017-03-17 16:41:36

标签: c# entity-framework

创建新的父对象时,我需要在两个地方附加一个子对象。我收到错误:

  

无法确定有效的订购清单和对儿童的单一参考

我的模型看起来像:

public class Child() 
{
     public int Id { get; set; }
     public int ParentId { get; set; }
     public string Name { get; set; }
}

public class Parent
{
     public int Id { get; set; }
     public virtual ICollection<Child> Children { get; set; } 
     public int FavouriteChildId { get; set; }
     public virtual Child FavouriteChild { get; set; }

     public void AddChild(string name)
     {
         var child = new Child { Name = name };
         Children.Add(child);
         if (Children.Count() == 1)
         {
            FavouriteChild = child;
         }
     }
}

我为实体框架配置使用了流畅的映射:

public class ParentMap : EntityTypeConfiguration<Parent>
{
     public ParentMap()
     {
         this.HasRequired(t => t.FavouriteChild)
            .WithMany()
            .HasForeignKey(d => d.FavouriteChildId);
     }
} 

public class ChildMap : EntityTypeConfiguration<Child>
{
     public ChildMap()
     {
         this.HasRequired(t => t.Parent)
            .WithMany(t => t.Children)
            .HasForeignKey(d => d.ParentId );
     }
}

插入数据库时​​,我使用:

// Snipped out a standard EF Database context, repositories, generics, etc.
var newParent = new Parent();
newParent.AddChild("Felix");
newParent.AddChild("Naomi");

var parentSet = context.Set<Parent>();
parentSet.Add(newParent);
context.SaveChanges();

SaveChanges()抛出上面给出的错误。

我想我的映射设置方式有问题,实体框架无法解决插入Child的问题。

我不能分两步完成,因为我需要至少有一个Favorite Child(因此FavouriteChildId整数不可为空)。我还想避免将“收藏夹”的概念移到Child实体(通过添加布尔属性),因为孩子永远不应该知道它是最喜欢的。偏袒是父母的一个方面。

提前致谢。

1 个答案:

答案 0 :(得分:1)

我觉得你需要重新设计它。

我们似乎迫使实体陷入Chicken or the Egg困境。

  • Parent需要先插入Child 这是因为插入Parent需要FavouriteChildId

  • Child需要在Parent之前插入ParentId,因为需要Parent 插入儿童。

应首先插入哪一个,Child<i> ng-show="! showDropdown" </i><i> ng-show="showDropdown" </i>