![](/img/trans.png)
[英]EF Core 5.0 - How to seed entity with List<string> property in a migration?
[英]How to override List property in EF Core 6?
我有一个问题,在数据库中我有一个 object 的 class 目录,在 CatalogUsers 中有 3 个元素。 我想用 2 元素列表替换该列表,这是没有 1 position 的原始列表。我的目标是删除新列表中遗漏的元素。
CatalogUsers 是目录和用户之间的多对多关系
public class Catalog
{
[Key, Column(Order = 1)]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
public string DefaultCurrencyCode { get; set; }
public virtual Currency? DefaultCurrency { get; set; }
public virtual List<CatalogUser>? CatalogUsers { get; set; }
}
public class CatalogUser
{
public int CatalogId { get; set; }
public virtual Catalog? Catalog { get; set; }
public int UserId { get; set; }
public virtual User? User { get; set; }
public CatalogUserRole Role { get; set; }
}
public class User
{
[Key, Column(Order = 1)]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string? Username { get; set; }
public string? Email { get; set; }
public string? Password { get; set; }
public virtual List<CatalogUser>? CatalogUsers { get; set; }
}
现在我试着这样做:
public async Task<int> UpdateAsync(Catalog model)
{
var _catalog = await GetByIdAsync(model.Id);
if (_catalog is null) return 0;
_catalog.Name = model.Name;
_catalog.DefaultCurrencyCode = model.DefaultCurrencyCode;
_catalog.CatalogUsers = model.CatalogUsers;
_context.Catalogs.Update(_catalog);
return await _context.SaveChangesAsync();
}
但它不起作用缺少的元素仍在数据库中
这可以使用级联删除来完成,如文档中所述。
但是要发生级联,需要修改被跟踪的实体。 如果您用不包括已删除项目的新列表替换该列表,则跟踪将被切断。 EF 将尝试将列表中的元素与实体相匹配(甚至在数据库中添加实体的副本),但不会将删除的项目标记为删除。
您需要手动从被跟踪实体中删除项目。 例如
public async Task<int> UpdateAsync(Catalog model)
{
var _catalog = await GetByIdAsync(model.Id);
if (_catalog is null) return 0;
_catalog.Name = model.Name;
foreach(var catalogUser in _catalog.CatalogUsers.
.Where(cuIdDb => !model.CatalogUsers
.Any(cuInModel =>
// comparing by value, not reference e.g.:
cuInModel.Id == cuIdDb.Id))
.ToList()) // required as you are modifying the list
{
_catalog.CatalogUsers.Remove(catalogUser);
}
//_context.Catalogs.Update(_catalog);// shouldn't be required due to entity tracking
return await _context.SaveChangesAsync();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.