【问题标题】:EF Model with collection and navigation to a particular element具有集合和导航到特定元素的 EF 模型
【发布时间】:2016-04-18 05:11:17
【问题描述】:

如何配置具有模型类的 EF6 迁移?

  • 项目集合
  • 一个特定项目的导航属性
public class MyModel
{
    [Key]
    public int Id { get; set; }

    // My collection of elements
    public virtual ICollection<MyCollectionElement> MyCollection { get; set; }

    // Optional navigation to a particular element from the collection
    [ForeignKey("CurrentElement")]
    public int? CurrentElementId { get; set; }

    public virtual MyCollectionElement CurrentElement { get; set; }
}

public class MyCollectionElement
{
    [Key]
    public int Id { get; set; }

    // Required navigation to MyClass
    [ForeignKey("MyModel")]
    public int MyModelID { get; set; }

    public virtual MyModel Model { get; set; }
}

配置

modelBuilder.Entity<MyModel>()
    .HasMany(x => x.MyCollection)
    .WithRequired(x => x.Model)
    .HasForeignKey(x => x.MyModelID)
    .WillCascadadeOnDelete(false);

Update-Database 上抛出几个错误,比如

无法确定相关操作的有效顺序。

我想要一个不涉及 MyCollectionElement 中的boolean IsCurrent 的解决方案,以便稍后进行另一个查询并查找当前元素;相反,我想将当前元素的 id 与我的模型一起存储,例如暴露。

另外,如果更容易的话,我不介意让 int CurrentElementId 不可为空(必需)。

谢谢。

【问题讨论】:

    标签: entity-framework ef-fluent-api


    【解决方案1】:

    当存在循环关系时,这种先有鸡还是先有蛋的问题总是会出现。错误...

    无法确定相关操作的有效顺序。

    ...在创建数据库时不会抛出。可以很好地创建数据库。当您尝试在同一工作单元中插入一条MyModel 记录和一条MyCollectionElement 相互引用时,就会发生这种情况。在Seed 方法中,您可能有类似

    var element = new MyCollectionElement();
    var model = new MyModel();
    model.MyCollection.Add(element);
    model.CurrentElement = element;
    

    语句model.MyCollection.Add(element); 需要先插入model,所以element 可以在其外键中引用它。但是model.CurrentElement = element;需要先插入element

    您只能通过两次调用SaveChanges 来避免这种情况,如果您希望分配是事务性的,则将所有内容包装在TransactionScope 中:

    using(var ts = new TransactionScope())
    {    
        using(var db = new MyContext()
        {
            var element = new MyCollectionElement();
            var model = new MyModel();
            model.MyCollection.Add(element);
            db.MyModels.Add(model);
            db.SaveChanges();
    
            model.CurrentElement = element;
            db.SaveChanges();
        }
        ts.Complete();
    }
    

    这也意味着int CurrentElementId 应该保持为空。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-19
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      相关资源
      最近更新 更多