【发布时间】:2026-02-22 21:50:01
【问题描述】:
我一直在尝试利用一种创建多对多关系的新方法 - nice article about EF 5 many-to-many relationships。
文章指出您不再需要定义关系类,框架会为您完成这项工作。
但是,几个小时以来,我一直在努力将现有实体添加到另一个实体的集合中。
我的模型
public record Bottle
{
[Key]
public int Id { get; set; }
[Required]
public string Username { get; set; }
// some other properties
public Collection<User> Owners { get; set; }
}
public record User
{
[Key]
public int Id { get; set; }
// some other properties
public Collection<Bottle> Bottles { get; set; }
}
假设我想在数据库中添加一个新瓶子。我也认识那个瓶子的主人。我原以为这段代码可以工作:
public async Task<int> AddBottle(BottleForAddition bottle)
{
var bottleEntity = mapper.Map<Bottle>(bottle);
bottleEntity.Owners = bottle
.OwnerIds // List<int>
.Select(id => new User { Id = id })
.ToCollection(); // my extension method
var createdEntity = await context.AddEntityAsync(bottleEntity);
await context.SaveChangesAsync();
return createdEntity.Entity.Id;
}
但遗憾的是它不起作用(BottleForAddition 是具有几乎相同属性的 DTO)。
我收到此错误:
无法创建瓶子(错误:Microsoft.EntityFrameworkCore.DbUpdateException:更新条目时发生错误。有关详细信息,请参阅内部异常。
Microsoft.Data.Sqlite.SqliteException (0x80004005):SQLite 错误 19:'NOT NULL 约束失败:Users.Username'。
在 Microsoft.Data.Sqlite.SqliteException.ThrowExceptionForRC(Int32 rc, sqlite3 db)
在 Microsoft.Data.Sqlite.SqliteDataReader.NextResult()
在...
所以我想出了这个
public async Task<int> AddBottle(BottleForAddition bottle)
{
var bottleEntity = mapper.Map<Bottle>(bottle);
bottleEntity.Owners = (await context.Users
.Where(u => bottle.OwnerIds.Contains(u.Id))
.ToListAsync())
.ToCollection();
var createdEntity = await context.AddEntityAsync(bottleEntity);
await context.SaveChangesAsync();
return createdEntity.Entity.Id;
}
这可行,但我必须从数据库中获取Users。
你知道如何处理它的更好方法吗?
【问题讨论】:
-
添加了答案。看看有没有帮助。
标签: c# sqlite entity-framework entity-framework-core c#-5.0