gpt4 book ai didi

c# - .Net 实体多对多 SaveChanges

转载 作者:行者123 更新时间:2023-11-30 18:36:24 26 4
gpt4 key购买 nike

我一直在玩 Entity Core 类,例如 DbContext,在尝试保存对象时遇到以下错误:

An error occurred while saving entities that do not expose foreign key properties for their relationships. The EntityEntries property will return null because a single entity cannot be identified as the source of the exception. Handling of exceptions while saving can be made easier by exposing foreign key properties in your entity types. See the InnerException for details.

我的 erd 基本上是多对多的,例如

comment   comment_category   category
id comment_id id
text category_id name

comment_category 表是将评论映射到类别的组合主键

检索数据没问题,但当我尝试保存它时,会提示这种关系

我最感兴趣的模型长什么样

public class Comment
{
[Key]
public int Comment_Id {get;set;}
public string Text {get;set;}
public virtual List<Category> Categories { get; set; }
}
public class Comment_Category
{
[Key, Column(Order = 0)]
public int Comment_Id {get;set;}
[Key, Column(Order = 2)]
public int Factor_Id {get;set;}
}

及其使用如

#Comments have Categories with Category Id filled and Comment Id null
List<Comment> comments = getComments();
using(dbContext db = new dbContext())
{
foreach( Comment c in comments)
db.Comments.add(c);
db.SaveChanges();
}

我不完全确定为什么它可以很容易地找到它但很难节省时间。我能想到的唯一区别是我保存的评论是新的,所以它们只有评论类别,没有评论 ID,只有类别 ID。我假设它会保存评论并将 comment_id 分配给 comment_category 表,所以我不确定如何完成此操作

我意识到也许我的方法是错误的,因为我使用的是映射表而不是类别的实际实体,所以如果有人知道更好的方法,请分享。

谢谢!

最佳答案

无需太多仪式即可完成此操作的最简单方法是在类别上也有一个 Comments 集合,并让 Entity Framework 推断 M:M 关系。它将自动创建一个包含主键和外键的 CategoryComments 表。

因此对于模型,我们只需:

public class Comment
{
[Key]
public int Comment_Id { get; set; }
public string Text { get; set; }
public virtual List<Category> Categories { get; set; }
}

public class Category
{
[Key]
public int Category_Id { get; set; }
public string Name { get; set; }
public virtual List<Comment> Comments { get; set; }
}

用法类似于:

public class MyDbContext : DbContext
{
public DbSet<Comment> Comments { get; set; }
public DbSet<Category> Categories { get; set; }
}

using (var db = new MyDbContext())
{
var blue = new Category { Name = "Blue" };
var red = new Category { Name = "Red" };
db.Categories.Add(blue);
db.Categories.Add(red);

db.Comments.Add(new Comment
{
Text = "Hi",
Categories = new List<Category> { blue }
});

db.SaveChanges();
}

关于c# - .Net 实体多对多 SaveChanges,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13707251/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com