EF6代码第一个多个一对多映射问题/“多重性”错误

1980年代

尝试创建数据库时收到以下错误:

在模型生成过程中检测到一个或多个验证错误:

Interaction_CauseElement_Source::多重性在关系'Interaction_CauseElement'中的角色'Interaction_CauseElement_Source'中无效。因为从属角色属性不是关键属性,所以从属角色多重性的上限必须为'*'。

Interaction_EffectElement_Source::多重性在关系'Interaction_EffectElement'中的角色'Interaction_EffectElement_Source'中无效。因为从属角色属性不是关键属性,所以从属角色多重性的上限必须为'*'。

我在其他Stack Overflow帖子中也看到了此错误,但是在我发现的示例中,OP试图在表之间的两个方向上建立1对1的关系。那不是我想要的。

这是我的模型:

public class Element
{
    [Key]
    public int ID { get; set; }

    [Required, MaxLength(64)]
    public string Name { get; set; }

    [MaxLength(200)]
    public string Description { get; set; }
}

public class Interaction
{
    [Key]
    public int ID { get; set; }

    [Index, Required]
    public int CauseID { get; set; }

    [Index, Required]
    public int EffectID { get; set; }

    [MaxLength(64)]
    public string Location { get; set; }    

    [ForeignKey("CauseID")]
    public virtual Element CauseElement { get; set; }

    [ForeignKey("EffectID")]
    public virtual Element EffectElement { get; set; }
}

Elements表中的项目是唯一的。一对元素可以在任意数量的位置相互交互。CauseID / EffectID对将不是唯一的。

我要更改模型的唯一其他地方是该OnModelCreating方法。我收到此错误:

在表“交互”上引入外键约束“ FK_dbo.Interactions_dbo.Elements_Cause”可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。无法创建约束。请参阅先前的错误。

并且不得不为模型创建一个级联策略。此代码修复了该错误:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    //Prevent cyclic cascade on elements table
    modelBuilder.Entity<Interaction>()
        .HasRequired(i => i.CauseElement)
        .WithRequiredDependent()
        .WillCascadeOnDelete(false);
    modelBuilder.Entity<Interaction>()
        .HasRequired(i => i.EffectElement)
        .WithRequiredDependent()
        .WillCascadeOnDelete(false);

    base.OnModelCreating(modelBuilder);
}

但是后来我收到了神秘的“多重性”错误。似乎希望我将其public virtual Element CauseElement放入像这样的集合中public virtual ICollection<Element> CauseElement,但这无法正确地建立关系模型。

1980年代

我找到了解决方案。EntityFrameworkTutoral.net上的这篇文章有所帮助。因为我需要从Interaction类到Element类的两个引用,所以这种关系太复杂了,无法在仅具有属性的EF中进行建模。

我必须更新模型,然后使用流畅的API告诉EF如何处理这些关系。我将模型更新为以下内容:

public class Element
{
    public Element()
    {
        CauseElements = new List<Interaction>();
        EffectElements = new List<Interaction>();
    }

    [Key]
    public int ID { get; set; }

    [Required, MaxLength(64)]
    public string Name { get; set; }

    #region Navigation

    public virtual ICollection<Interaction> CauseElements { get; set; }
    public virtual ICollection<Interaction> EffectElements { get; set; }

    #endregion
}

public class Interaction
{
    [Key]
    public int ID { get; set; }

    [Index]
    public int CauseID { get; set; }

    [Index]
    public int EffectID { get; set; }

    [MaxLength(64)]
    public string Location { get; set; }

    #region Navigation

    [ForeignKey("CauseID")]
    public virtual Element CauseElement { get; set; }

    [ForeignKey("EffectID")]
    public virtual Element EffectElement { get; set; }

    #endregion
}

在我的DbContext类中,我使用了流畅的API在Interaction.CauseElementandElement.CauseElements之间创建了链接,其中属性是Interaction的外键(与Effect关系相同):

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    //Prevent cyclic cascade on elements table
    modelBuilder.Entity<Interaction>()
        .HasRequired(i => i.CauseElement)
        .WithRequiredDependent()
        .WillCascadeOnDelete(false);
    modelBuilder.Entity<Interaction>()
        .HasRequired(i => i.EffectElement)
        .WithRequiredDependent()
        .WillCascadeOnDelete(false);

    //Create the links between the element, the key, and the collection
    modelBuilder.Entity<Interaction>()
        .HasRequired<Element>(i => i.CauseElement)
        .WithMany(e => e.CauseElements)
        .HasForeignKey(i => i.CauseID);
    modelBuilder.Entity<Interaction>()
        .HasRequired<Element>(i => i.EffectElement)
        .WithMany(e => e.EffectElements)
        .HasForeignKey(i => i.EffectID);

    base.OnModelCreating(modelBuilder);
}

看起来,当您具有简单的一对多关系时,Entity Framework会尝试自动推断表之间的关系。如果我删除EffectElementInteraction类(EffectElementsElement),EF能够轻松地创建关系。但是,当我重新添加它时,我再次收到错误。

由于该Element类型在Interaction班级中出现过两次,因此它不知道如何创建关系。我必须在OnModelCreating方法中明确定义它

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

EF6代码第一个多个一对多映射问题/“多重性”错误

来自分类Dev

EF 6代码第一个对象生命周期/信号/事件

来自分类Dev

EF 6.1代码第一个迁移十进制?到小数

来自分类Dev

如何为一个模型创建两个导航属性(EF6代码优先)

来自分类Dev

EF6代码优先-使用不匹配的外键配置一对一关系

来自分类Dev

EF6代码优先-使用不匹配的外键配置一对一关系

来自分类Dev

实体框架6代码优先一对多可选关系消除子问题

来自分类Dev

在实体框架6代码优先方法中在两个表之间创建一对多和多对一映射

来自分类Dev

MVC 4代码第一个ForeignKeyAttribute属性...类型...无效

来自分类Dev

为一对多关系编写第一个多个外键代码

来自分类Dev

实体框架代码第一个一对多级联错误

来自分类Dev

实体框架核心3.1代码第一个唯一约束不起作用

来自分类Dev

具有相同类型导航属性集合的EF6代码第一实体-如何告诉EF是什么关系?

来自分类Dev

实体框架代码第一个到多个可选,具有流畅的映射

来自分类Dev

EF代码第一个带有多个键的外键

来自分类Dev

是否有一个有效的单一代码来获取目录中的第一个文件?

来自分类Dev

具有相同类别的2个FK的EF代码第一个映射表

来自分类Dev

实体框架6代码第一VarBinary映射或计算列中的长度

来自分类Dev

在EF6代码中,首先我可以更改导航属性值,然后断开关系,并将两个更改都保存在一个事务中吗?

来自分类Dev

Symfony表单创建新对象并创建第一个一对多对象

来自分类Dev

EF6代码优先:将参数传递给映射的删除存储过程

来自分类Dev

代码与父类别的第一个一对多关系和类别

来自分类Dev

首先在EF6代码中创建多对多关系

来自分类Dev

在C ++中访问映射中的一对的第一个和第二个时出现编译器错误

来自分类Dev

EF6代码优先-可能导致循环或多个级联路径

来自分类Dev

MySQL一对多映射查询-如果匹配多个,则不返回一个

来自分类Dev

EF代码优先一对一和一对多映射

来自分类Dev

具有相同实体的2个属性时的EF6代码优先混淆

来自分类Dev

如何在流利的ef核心中定义一个映射到多个一对多的共享超级类型的列表属性?

Related 相关文章

  1. 1

    EF6代码第一个多个一对多映射问题/“多重性”错误

  2. 2

    EF 6代码第一个对象生命周期/信号/事件

  3. 3

    EF 6.1代码第一个迁移十进制?到小数

  4. 4

    如何为一个模型创建两个导航属性(EF6代码优先)

  5. 5

    EF6代码优先-使用不匹配的外键配置一对一关系

  6. 6

    EF6代码优先-使用不匹配的外键配置一对一关系

  7. 7

    实体框架6代码优先一对多可选关系消除子问题

  8. 8

    在实体框架6代码优先方法中在两个表之间创建一对多和多对一映射

  9. 9

    MVC 4代码第一个ForeignKeyAttribute属性...类型...无效

  10. 10

    为一对多关系编写第一个多个外键代码

  11. 11

    实体框架代码第一个一对多级联错误

  12. 12

    实体框架核心3.1代码第一个唯一约束不起作用

  13. 13

    具有相同类型导航属性集合的EF6代码第一实体-如何告诉EF是什么关系?

  14. 14

    实体框架代码第一个到多个可选,具有流畅的映射

  15. 15

    EF代码第一个带有多个键的外键

  16. 16

    是否有一个有效的单一代码来获取目录中的第一个文件?

  17. 17

    具有相同类别的2个FK的EF代码第一个映射表

  18. 18

    实体框架6代码第一VarBinary映射或计算列中的长度

  19. 19

    在EF6代码中,首先我可以更改导航属性值,然后断开关系,并将两个更改都保存在一个事务中吗?

  20. 20

    Symfony表单创建新对象并创建第一个一对多对象

  21. 21

    EF6代码优先:将参数传递给映射的删除存储过程

  22. 22

    代码与父类别的第一个一对多关系和类别

  23. 23

    首先在EF6代码中创建多对多关系

  24. 24

    在C ++中访问映射中的一对的第一个和第二个时出现编译器错误

  25. 25

    EF6代码优先-可能导致循环或多个级联路径

  26. 26

    MySQL一对多映射查询-如果匹配多个,则不返回一个

  27. 27

    EF代码优先一对一和一对多映射

  28. 28

    具有相同实体的2个属性时的EF6代码优先混淆

  29. 29

    如何在流利的ef核心中定义一个映射到多个一对多的共享超级类型的列表属性?

热门标签

归档