使用 EF Core 添加 ID 为 0 的实体
Adding entities with Id 0 using EF Core
我正在尝试更新名为 Tags 的 ICollection Navigation 属性,它属于用户实体:
if (memberUpdateDto.Tags != null)
{
user.Tags = new List<UsersTags>();
foreach (TagDto tagDto in memberUpdateDto.Tags)
{
user.Tags.Add(new UsersTags
{
AppUserId = user.Id,
TagId = tagDto.Value
});
}
}
UserTags 连接用户和标签的地方:
public class UsersTags
{
public int Id { get; set; }
public int AppUserId { get; set; }
public AppUser AppUser { get; set; }
public int TagId { get; set; }
public Tag Tag { get; set; }
}
这给出了下一个错误:
"Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while updating the entries. See the inner exception for details.
---> Microsoft.Data.Sqlite.SqliteException (0x80004005): SQLite Error 19: 'FOREIGN KEY constraint failed'.
我认为这是因为 UsersTags 的 Id 为 0。
如代码所示,我想删除旧的,只添加新的,我如何告诉 EF 忽略那个 Id,只添加新的?
根据 Serge 的回答 - 我想避免创建另一个存储库,而是将导航属性更新为用户实体的一部分(我相信这是可能的)。
我的标签:
Id CreatorId IsApproved 文本
1 空 1 SQL
2 空 1 Python
3 NULL 1 反应
4 空 1 Angular
试试这个
var newUserTags = new List<UsersTags>();
if (memberUpdateDto.Tags != null)
{
foreach (TagDto tagDto in memberUpdateDto.Tags)
{
newUserTags.Add(new UsersTags
{
AppUserId = user.Id,
TagId = tagDto.Value
});
}
}
var prevUserTags=context.UserTags.Where(i=>i.UserId=user.Id).ToList();
if ( prevUserTags!=null && prevUserTags.Count > 0 ) context.UserTags.RemoveRange(prevUserTags);
if ( newUserTags.Count > 0 ) context.UserTags.AddRange(newUserTags);
context.SaveChanges();
您不需要在循环中分配 AppUserId,因为它会将标签添加到指定的用户,因此正确的版本是:
foreach (TagDto tagDto in memberUpdateDto.Tags)
{
user.Tags.Add(new UsersTags
{
TagId = tagDto.Value
});
}
如果你想删除之前的记录你只需要在循环之前写这行:
context.Set<UsersTags>().RemoveRange(user.Tags);
我正在尝试更新名为 Tags 的 ICollection Navigation 属性,它属于用户实体:
if (memberUpdateDto.Tags != null)
{
user.Tags = new List<UsersTags>();
foreach (TagDto tagDto in memberUpdateDto.Tags)
{
user.Tags.Add(new UsersTags
{
AppUserId = user.Id,
TagId = tagDto.Value
});
}
}
UserTags 连接用户和标签的地方:
public class UsersTags
{
public int Id { get; set; }
public int AppUserId { get; set; }
public AppUser AppUser { get; set; }
public int TagId { get; set; }
public Tag Tag { get; set; }
}
这给出了下一个错误:
"Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while updating the entries. See the inner exception for details.
---> Microsoft.Data.Sqlite.SqliteException (0x80004005): SQLite Error 19: 'FOREIGN KEY constraint failed'.
我认为这是因为 UsersTags 的 Id 为 0。
如代码所示,我想删除旧的,只添加新的,我如何告诉 EF 忽略那个 Id,只添加新的?
根据 Serge 的回答 - 我想避免创建另一个存储库,而是将导航属性更新为用户实体的一部分(我相信这是可能的)。
我的标签:
Id CreatorId IsApproved 文本
1 空 1 SQL
2 空 1 Python
3 NULL 1 反应
4 空 1 Angular
试试这个
var newUserTags = new List<UsersTags>();
if (memberUpdateDto.Tags != null)
{
foreach (TagDto tagDto in memberUpdateDto.Tags)
{
newUserTags.Add(new UsersTags
{
AppUserId = user.Id,
TagId = tagDto.Value
});
}
}
var prevUserTags=context.UserTags.Where(i=>i.UserId=user.Id).ToList();
if ( prevUserTags!=null && prevUserTags.Count > 0 ) context.UserTags.RemoveRange(prevUserTags);
if ( newUserTags.Count > 0 ) context.UserTags.AddRange(newUserTags);
context.SaveChanges();
您不需要在循环中分配 AppUserId,因为它会将标签添加到指定的用户,因此正确的版本是:
foreach (TagDto tagDto in memberUpdateDto.Tags)
{
user.Tags.Add(new UsersTags
{
TagId = tagDto.Value
});
}
如果你想删除之前的记录你只需要在循环之前写这行:
context.Set<UsersTags>().RemoveRange(user.Tags);