gpt4 book ai didi

asp.net-web-api - EF5 代码首先使用 ASP.NET Web API : Update entity with many-to-many relationship

转载 作者:行者123 更新时间:2023-12-04 14:02:15 27 4
gpt4 key购买 nike

我正在尝试更新 Customer在我的数据库中使用 ASP.NET Web API 和 Entity Framework 5 代码优先,但它不起作用。我的实体如下所示:

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

// More fields

public ICollection<CustomerTypeModel> CustomerTypes { get; set; }
}

public class CustomerTypeModel
{
public int Id { get; set; }
public string Type { get; set; }

[JsonIgnore]
public ICollection<CustomerModel> Customers { get; set; }
}

没什么特别的。我已经构建了一个 Web 界面,用户可以在其中通过提供名称并检查一个或多个客户类型来添加客户。当点击提交按钮时,数据被发送到我的 Web API 方法:
public void Put([FromBody]CustomerModel customer)
{
using (var context = new MyContext())
{
context.Customers.Attach(customer);
context.Entry(customer).State = EntityState.Modified;
context.SaveChanges();
}
}

这会更新客户字段,但会忽略相关的客户类型。来电 customer对象确实包含一个列表 CustomerTypes它应该与:
[0] => { Id: 1, Type: "Finance", Customers: Null },
[1] => { Id: 2, Type: "Insurance", Customers: Null }
[2] => { Id: 3, Type: "Electronics", Customers: Null }

但是,EF 没有查看此列表并添加/删除关联实体,而是忽略它。新关联将被忽略,现有关联即使被删除也会保留。

我在将客户插入数据库时​​遇到了类似的问题,当我将这些实体的状态调整为 EntityState.Unchanged 时,这个问题得到了解决。 .自然地,我尝试在我的更新场景中应用相同的魔法修复:
public void Put([FromBody]CustomerModel customer)
{
using (var context = new MyContext())
{
foreach (var customertype in customer.CustomerTypes)
{
context.Entry(customertype).State = EntityState.Unchanged;
}

context.Customers.Attach(customer);
context.Entry(customer).State = EntityState.Modified;
context.SaveChanges();
}
}

但 EF 一直显示相同的行为。

有想法该怎么解决这个吗?或者我真的应该手动清除 CustomerTypes 的列表然后手动添加它们?

提前致谢。

J.P

最佳答案

仅通过设置实体状态并不能真正解决此问题。您必须首先从数据库加载客户,包括其所有当前类型,然后根据已发布客户的更新类型集合从加载的客户中删除类型或向其添加类型。更改跟踪将完成其余的工作以从连接表中删除条目或插入新条目:

public void Put([FromBody]CustomerModel customer)
{
using (var context = new MyContext())
{
var customerInDb = context.Customers.Include(c => c.CustomerTypes)
.Single(c => c.Id == customer.Id);

// Updates the Name property
context.Entry(customerInDb).CurrentValues.SetValues(customer);

// Remove types
foreach (var typeInDb in customerInDb.CustomerTypes.ToList())
if (!customer.CustomerTypes.Any(t => t.Id == typeInDb.Id))
customerInDb.CustomerTypes.Remove(typeInDb);

// Add new types
foreach (var type in customer.CustomerTypes)
if (!customerInDb.CustomerTypes.Any(t => t.Id == type.Id))
{
context.CustomerTypes.Attach(type);
customerInDb.CustomerTypes.Add(type);
}

context.SaveChanges();
}
}

关于asp.net-web-api - EF5 代码首先使用 ASP.NET Web API : Update entity with many-to-many relationship,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16584800/

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