EF Core 3.0 在一对多关系中将连接的实体添加到集合失败
EF Core 3.0 adding connected entity to collection fails in One To Many relationship
我尝试通过集合的导航 属性 添加实体,但出现以下消息:
"Database operation expected to affect 1 row(s) but actually affected 0 row(s). Data may have been modified or deleted since entities were loaded. See http://go.microsoft.com/fwlink/?LinkId=527962 for information on understanding and handling optimistic concurrency exceptions."
模型是:
SuggestionGroupDb:
public class SuggestionGroupDb
{
public Guid Id { get; set; }
[Required]
public string UserId { get; set; }
[ForeignKey("UserId")]
public virtual TeguUserDb User { get; set; }
[Required(AllowEmptyStrings=false, ErrorMessage = "Required")]
[StringLength(30, MinimumLength = 1, ErrorMessage = "Invalid")]
public string Name { get; set; }
public int OrderNo { get; set; }
public virtual ICollection<SuggestionItemDb> Items { get; set; }
}
SuggestionItemDb:
public class SuggestionItemDb
{
public Guid Id { get; set; }
[Required]
public Guid SuggestionGroupId { get; set; }
[ForeignKey("SuggestionGroupId")]
public virtual SuggestionGroupDb SuggestionGroup { get; set; }
[Required(AllowEmptyStrings=false, ErrorMessage = "Required")]
[StringLength(30, MinimumLength = 1, ErrorMessage = "Invalid")]
public string Name { get; set; }
public int OrderNo { get; set; }
}
SuggestionGroup 存储库更新功能(简化):
public async Task<SuggestionGroupRepositoryResult> UpdateAsync(string userid, SuggestionGroupDb suggestiongroup)
{
// Step 01 - Get the Entity
var dbSuggestionGroup = await GetAsync(userid, suggestiongroup.Id, suggestiongroup.Name);
// Step 02 - Update the items (just add one now)
foreach (var item in suggestiongroup.Items)
{
var sidb = new SuggestionItemDb() {Id = item.Id, Name = item.Name, OrderNo = item.OrderNo, SuggestionGroupId = item.SuggestionGroupId};
dbSuggestionGroup .Items.Add(sidb);
}
// Step 03 - Update the changes
try
{
var updated = context.AccSuggestionGroups.Update(dbSuggestionGroup);
await context.SaveChangesAsync();
return new SuggestionGroupRepositoryResult("Valid") /*{SuggestionGroup = updated.Entity}*/;
}
catch (Exception e)
{
context.Reset();
return new SuggestionGroupRepositoryResult("Failed", e.Message);
}
}
问题是 SaveChanges 抛出给定消息异常。
是否可以通过 SuggestionGroup 更新 SuggestionItems?
我正在使用 EF Core 3.0 预览版 6。
在 EF Core 3.0 之前,DetectChanges
策略发现的未跟踪实体(在您的情况下,通过将未跟踪实体添加到集合中)将自动处于 Added
状态。
不再是这种情况。从Entity Framework Core 3.0开始,实体将自动添加到Modified
状态。
Why
This change was made to make it easier and more consistent to work with disconnected entity graphs while using store-generated keys.
Source: EF Core 3.0 - Breaking Changes
您可以强制在 Added
状态下添加新的未跟踪实体,方法是将键 属性 配置为明确不使用生成的值。
例如:
public class SuggestionItemDb
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public Guid Id { get; set; }
}
或者使用流利的API
modelBuilder
.Entity<SuggestionItemDb>()
.Property(e => e.Id)
.ValueGeneratedNever();
我尝试通过集合的导航 属性 添加实体,但出现以下消息:
"Database operation expected to affect 1 row(s) but actually affected 0 row(s). Data may have been modified or deleted since entities were loaded. See http://go.microsoft.com/fwlink/?LinkId=527962 for information on understanding and handling optimistic concurrency exceptions."
模型是:
SuggestionGroupDb:
public class SuggestionGroupDb
{
public Guid Id { get; set; }
[Required]
public string UserId { get; set; }
[ForeignKey("UserId")]
public virtual TeguUserDb User { get; set; }
[Required(AllowEmptyStrings=false, ErrorMessage = "Required")]
[StringLength(30, MinimumLength = 1, ErrorMessage = "Invalid")]
public string Name { get; set; }
public int OrderNo { get; set; }
public virtual ICollection<SuggestionItemDb> Items { get; set; }
}
SuggestionItemDb:
public class SuggestionItemDb
{
public Guid Id { get; set; }
[Required]
public Guid SuggestionGroupId { get; set; }
[ForeignKey("SuggestionGroupId")]
public virtual SuggestionGroupDb SuggestionGroup { get; set; }
[Required(AllowEmptyStrings=false, ErrorMessage = "Required")]
[StringLength(30, MinimumLength = 1, ErrorMessage = "Invalid")]
public string Name { get; set; }
public int OrderNo { get; set; }
}
SuggestionGroup 存储库更新功能(简化):
public async Task<SuggestionGroupRepositoryResult> UpdateAsync(string userid, SuggestionGroupDb suggestiongroup)
{
// Step 01 - Get the Entity
var dbSuggestionGroup = await GetAsync(userid, suggestiongroup.Id, suggestiongroup.Name);
// Step 02 - Update the items (just add one now)
foreach (var item in suggestiongroup.Items)
{
var sidb = new SuggestionItemDb() {Id = item.Id, Name = item.Name, OrderNo = item.OrderNo, SuggestionGroupId = item.SuggestionGroupId};
dbSuggestionGroup .Items.Add(sidb);
}
// Step 03 - Update the changes
try
{
var updated = context.AccSuggestionGroups.Update(dbSuggestionGroup);
await context.SaveChangesAsync();
return new SuggestionGroupRepositoryResult("Valid") /*{SuggestionGroup = updated.Entity}*/;
}
catch (Exception e)
{
context.Reset();
return new SuggestionGroupRepositoryResult("Failed", e.Message);
}
}
问题是 SaveChanges 抛出给定消息异常。 是否可以通过 SuggestionGroup 更新 SuggestionItems?
我正在使用 EF Core 3.0 预览版 6。
在 EF Core 3.0 之前,DetectChanges
策略发现的未跟踪实体(在您的情况下,通过将未跟踪实体添加到集合中)将自动处于 Added
状态。
不再是这种情况。从Entity Framework Core 3.0开始,实体将自动添加到Modified
状态。
Why
This change was made to make it easier and more consistent to work with disconnected entity graphs while using store-generated keys.
Source: EF Core 3.0 - Breaking Changes
您可以强制在 Added
状态下添加新的未跟踪实体,方法是将键 属性 配置为明确不使用生成的值。
例如:
public class SuggestionItemDb
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public Guid Id { get; set; }
}
或者使用流利的API
modelBuilder
.Entity<SuggestionItemDb>()
.Property(e => e.Id)
.ValueGeneratedNever();