如何使用Entity Framework为多对多关系表添加条目

29 浏览
0 Comments

如何使用Entity Framework为多对多关系表添加条目

我有一个包含三个表的数据库:Word, Idiom, WordIdiom,它们存储这两个表之间的多对多关系。 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();
        }
    }
}

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

类型为“System.Data.Entity.Infrastructure.DbUpdateException”的未处理异常发生于 EntityFramework.dll

附加信息: 保存未公开其关系的外键属性的实体时发生错误。该实体未公开其关系的外键属性,则 EntityEntries 属性将返回 null,因为无法将单个实体标识为异常源。公开实体类型中的外键属性可以简化保存时的异常处理。有关详细信息,请参阅 InnerException。

内部内部异常:

无法更新 EntitySet \'WordIdiomMatch\',因为它具有 DefiningQuery,且没有现行操作所需的与元素匹配的元素。

作为我第一次使用 Entity Framework,我真的不知道该如何解决这个问题。我尝试给 Entity Framework 模型添加 [ForeignKey()] 属性,但可能做错了。我还尝试为 WordIdiom 添加主键,但会破坏更多东西,因为在这种情况下,我甚至不能向 WordIdiom 表添加项目。

admin 更改状态以发布 2023年5月21日
0
0 Comments

首先,我发现你有两个add()具有相同的目的。这是错误的。想象一下它在数据库中会是什么样子:

wordItem.Idioms.Add(idiom);

好了,现在X和Y已经由链接表“X-Y”记录连接起来了。

idiom.Words.Add(wordItem);

现在…它将创建另一个记录,将它们作为“Y-X”连接在一起,这是无意义的,如果已经有一个“X-Y”记录,那么X将通过这个单个记录与Y连接在一起,反过来也一样。

我认为…通常链接表的主键是包含的两个外键的组合,因此双重添加无论如何都会崩溃。

0
0 Comments

我解决了这些问题,得到了@KerryRandolph和@AntoinePelletier的帮助。

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

正确的解决方案是在数据库上更改联接表,使得PK包括两个外键列。

0