【问题标题】:Replacing detached child collection EF Core替换分离的子集合 EF Core
【发布时间】:2019-06-07 12:18:26
【问题描述】:
public class PhoneNumber {
  public string Number {get; set;}
  public string Type {get; set;}
}

public class Customer {
   public ICollection<PhoneNumber> phones {get; set;}
}

我正在向我的 webapi 发布(放置)一个客户对象。发布的对象中包含的任何电话号码都是我希望保存在数据库中的only 电话号码。如果该客户的数据库中以前有数字,我希望将它们删除。

_context.Update(model);

我已尝试上述方法,但它只会添加或编辑现有电话号码。数据库中存在但未发布对象的数字不会被删除。

【问题讨论】:

  • 你的delete 方法在哪里?
  • @Eldho 这就是我要的。想做我想做的事情似乎很常见,所以我认为它会包含在框架中。
  • 您可以使用_context.MyEntities.Remove(yourModel); _context.SaveChanges(),但您需要连接手机才能删除特定实体。你也可以找stackoverflow.com/questions/41960215/…
  • @Eldho 所以没有办法用“一步”替换子集合,而是我必须手动删除旧的并插入新的?
  • 为什么不更新子集合中的值。

标签: c# entity-framework-core asp.net-core-webapi


【解决方案1】:

您可以尝试修改您的实体以定义 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(); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-03
    • 2020-04-09
    • 2018-11-06
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 2019-06-16
    • 2019-04-27
    相关资源
    最近更新 更多