【问题标题】:How to add entries for many to many relation table with Entity Framework如何使用实体框架为多对多关系表添加条目
【发布时间】:2015-12-30 23:12:54
【问题描述】:

我有一个包含三个表的数据库:WordIdiomWordIdiom,用于存储这两个表之间的多对多关系。 WordItem 仅包括 WordIdiom 表的外键。

之后,我创建了基于数据库的实体模型。我已经用相关的内容填写了两个表,现在我想在这些表之间添加交叉链接。

所以,我写了这段代码:

using (var db = new IdiomsDictionaryEntities())
{
    var allIdioms = from idiom in db.Idioms select idiom;

    foreach (var idiom in allIdioms)
    {
        string[] words = idiom.IdiomText.Split(new[] { " ", "-" }, StringSplitOptions.None);

        foreach (var word in words)
        {
            var wordItem = db.Words.SingleOrDefault(exWord => exWord.WordString.ToLower().Equals(word));
            if (wordItem == null)
            {
                Console.WriteLine("Idiom: " + idiom.IdiomText + ", missing word: " + word);
                continue;
            }

            idiom.Words.Add(wordItem);

            db.SaveChanges();
        }
    }
}

但是当我运行这段代码时,我得到了以下错误:

EntityFramework.dll 中出现“System.Data.Entity.Infrastructure.DbUpdateException”类型的未处理异常
附加信息:保存不为其关系公开外键属性的实体时发生错误。 EntityEntries 属性将返回 null,因为无法将单个实体标识为异常源。通过在实体类型中公开外键属性,可以更轻松地处理保存时的异常。有关详细信息,请参阅 InnerException。

内-内异常:

无法更新 EntitySet 'WordIdiomMatch',因为它有一个 DefiningQuery 并且元素中不存在支持当前操作的元素。`

因为这是我第一次使用 Entity Framework,我真的不知道如何解决这个问题。我试图将[ForeignKey()] 属性添加到实体框架模型,但可能做错了。我还尝试为WordIdiom 添加主键,但它会阻止更多事情,因为在这种情况下,我什至无法将项目添加到WordIdiom 表中。

【问题讨论】:

    标签: entity-framework sqlite foreign-keys many-to-many foreign-key-relationship


    【解决方案1】:

    在@KerryRandolph 和@AntoinePelletier 的帮助下,我已经解决了这些问题

    我试图使用Pure Join Table 更新从多对多关系派生的实体——这意味着除了外键之外不允许其他列。 如果在Join Table 中添加Primary Key 列,则会失去实体框架的所有优势,必须手动实现插入操作。

    正确的解决方案是更改数据库上的连接表,以创建包含两个外部 ID 列的 PK。

    【讨论】:

      【解决方案2】:

      首先,我看到您有 2 个 add() 用于相同目的。女巫错了。想象一下它在数据库中的样子:

      wordItem.Idioms.Add(idiom);
      

      现在 X 和 Y 由链接表链接为“X-Y”记录。

      idiom.Words.Add(wordItem);
      

      现在...它将创建另一个记录,将它们链接为“YX”女巫是无用的,如果已经有一个“XY”记录,那么 X 通过这个单一记录链接到 Y,反之亦然。

      我想说...通常链接表的主键是它包含的两个外键的组合,所以双加无论如何都会崩溃。

      【讨论】:

      • 谢谢,我删除了重复的 add() 命令,但错误仍然存​​在。
      • stackoverflow.com/questions/6823947/… 这解决了大部分多对多问题
      • 您能否详细说明一下您提供的链接中究竟缺少什么,因为我看不到任何与接受的答案不同的地方。
      • 嗬,是的,对不起,看起来实体毕竟绝对想要一个主键,我一直在研究这个:stackoverflow.com/questions/7583770/… 相信我,我正在努力帮助你跨度>
      猜你喜欢
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-13
      • 2017-01-28
      相关资源
      最近更新 更多