c# - 替换分离的子集合 EF Core
问题描述
public class PhoneNumber {
public string Number {get; set;}
public string Type {get; set;}
}
public class Customer {
public ICollection<PhoneNumber> phones {get; set;}
}
我正在向我的 webapi 发布(放置)一个客户对象。发布的对象中包含的任何电话号码都是我想要保存在数据库中的唯一电话号码。如果该客户的数据库中以前有数字,我希望将它们删除。
_context.Update(model);
我已经尝试过上述方法,但它只会添加或编辑现有的电话号码。数据库中存在但未发布对象的数字不会被删除。
解决方案
您可以尝试修改您的实体以定义 PhoneNumber 的复合键,该键由 PhoneNumber 的 Id 和 Customer 的外键组成:
public class Customer
{
[Key]
public int CustomerId { get; set; }
public ICollection<PhoneNumber> phones { get; set; }
}
public class PhoneNumber
{
[Key, ForeignKey("Customer"), Column(Order = 1)]
public int CustomerId { get; set; }
[Key, Column(Order = 0), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int PhoneNumberId { get; set; }
public string Number { get; set; }
public string Type { get; set; }
public Customer customer { get; set; }
}
要配置复合键,请在 DbConext 的重写方法 OnModelCreating 中使用 Fluent API 配置:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<PhoneNumber>()
.HasKey(c => new { c.CustomerId, c.PhoneNumberId });
}
更新您的数据库: Add-migration , Update-Database 。
然后在您的 api 中获取实体后,您可以更新 Customer 和子集合,例如:
Customer cs = new Customer();
cs.CustomerId = 1;
cs.name = "gg";
cs.phones = new List<PhoneNumber>();
cs.phones.Add(new PhoneNumber() { CustomerId = 1, Number = "12", Type = "gg" });
cs.phones.Add(new PhoneNumber() { CustomerId = 1, Number = "44", Type = "TT" });
var customer = db.customers.Include("phones").Single(o => o.CustomerId == cs.CustomerId);
customer.phones = cs.phones;
db.SaveChanges();
推荐阅读
- java - KryoException 找不到类序列化跟踪
- laravel - 基于布尔值无包渲染字段
- selenium - 如何解决量角器中的承诺
- android - 如何提交 Google 登录身份验证的 PlayStore 应用访问凭据(多次拒绝)?
- sql - 日期比较不适用于聚合
- python - 如何修复 UnicodeDecodeError:
- python - 如何从代码本身启用 WebGL?(在 Python 中使用 selenium、chromewebdriver)
- vba - 用宏修改 VBA 宏
- sql - 为什么这个查询太慢了?获取 A 的列表,其中每个项目都有一个关联的外键 B
- javascript - 将 URL 对象转换为 URl 字符串