gpt4 book ai didi

c# - 更新具有多对多关系的断开连接的实体

转载 作者:太空狗 更新时间:2023-10-29 19:47:11 26 4
gpt4 key购买 nike

假设我在 Entity Framework 代码优先设置中有以下模型类:

public class Person
{
public int Id { get; set; }
public string Name { get; set; }

public virtual ICollection<Team> Teams { get; set; }
}

public class Team
{
public int Id { get; set; }
public string Name { get; set; }

public virtual ICollection<Person> People { get; set; }
}

从这段代码创建的数据库包括一个 TeamPersons 表,表示人与团队之间的多对多关系。

现在假设我有一个断开连接的 Person 对象(不是代理,并且尚未附加到上下文),其 Teams 集合包含一个或多个断开连接的 Team 对象,所有这些都代表数据库中已有的 Teams。例如,如果数据库中已经存在一个 Id 为 1 的人和一个 Id 为 3 的团队,将由以下内容创建一个对象:

var person = new Person
{
Id = 1,
Name = "Bob",
Teams = new HashSet<Team>
{
new Team { Id = 3, Name = "C Team"}
}
};

更新此对象的最佳方法是什么,以便在更新后 TeamPersons 表包含 Bob 的一行,将他链接到 C Team?我已经尝试了显而易见的:

using (var context = new TestContext())
{
context.Entry(person).State = EntityState.Modified;
context.SaveChanges();
}

但是 Teams 集合被忽略了。我也尝试过其他各种方法,但似乎没有什么能完全满足我的要求。谢谢你的帮助。

编辑:

所以我知道我可以从数据库中获取 Person 和 Team[s],更新它们然后提交更改:

using (var context = new TestContext())
{
var dbPerson = context.People.Find(person.Id);
dbPerson.Name = person.Name;
dbPerson.Teams.Clear();
foreach (var id in person.Teams.Select(x => x.Id))
{
var team = context.Teams.Find(id);
dbPerson.Teams.Add(team);
}

context.SaveChanges();
}

不过,如果 Person 是一个复杂的实体,这会很痛苦。我知道我可以使用 Automapper 或其他东西来使事情变得更容易一些,但如果没有办法保存原始人对象,而不是必须获得一个新对象并将所有属性复制过来,这似乎仍然是一种耻辱......

最佳答案

一般方法是从数据库中获取Team并将其AddPersonTeams 收藏。设置 EntityState.Modified 只会影响标量属性,不会影响导航属性。

关于c# - 更新具有多对多关系的断开连接的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13405773/

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