【发布时间】:2021-03-22 15:47:25
【问题描述】:
我正在尝试将 Customer 添加到 CustomerCategory 的 Customers 集合中,但消息引发异常
数据库操作预计会影响 1 行,但实际上会影响 0 行。数据可能已被修改或删除,因为实体 已加载。
我在 .NET 5.0 类库中使用 Microsoft.EntityFrameworkCore.Sqlite Version 5.0.0 Microsoft.EntityFrameworkCore.Proxies Version 5.0.0
我已尝试简化类以帮助确定错误的原因,但没有成功。这是我目前所拥有的。
public class Customer
{
public Guid CustomerId { get; set; } = Guid.NewGuid();
public Guid CategoryId { get; set; }
public virtual CustomerCategory Category { get; set; }
public string FileAs { get; set; }
}
public class CustomerCategory
{
public Guid CategoryId { get; set; } = Guid.NewGuid();
public string CategoryCode { get; set; }
public virtual ICollection<Customer> Customers { get; set; }
}
public class DataContext : DbContext
{
public DbSet<Customer> Customers { get; set; }
public DbSet<CustomerCategory> CustomerCategories { get; set; }
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite(DataService.SqliteConnectionString);
optionsBuilder.UseLazyLoadingProxies();
base.OnConfiguring(optionsBuilder);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Customer>()
.HasOne(cus => cus.Category)
.WithMany(cat => cat.Customers)
.HasForeignKey(nameof(Customer.CategoryId));
modelBuilder.Entity<CustomerCategory>()
.HasKey(e => e.CategoryId);
}
在这个sn-p中调用db.SaveChanges()时抛出异常:
public static void AddCustomer()
{
using (DataContext db = new())
{
try
{
Guid cat1Guid = new Guid("FA754EE8-B343-4E0B-9A11-AA066E4678C0");
CustomerCategory category = db.CustomerCategories.Find(cat1Guid);
Customer customer = new();
customer.FileAs = "Fred-1";
category.Customers.Add(customer);
db.SaveChanges();
}
catch (Exception ex)
{ }
}
}
如何使用 Entity Framework Core 将成员添加到虚拟集合?
【问题讨论】:
-
首先删除
catch (Exception ex){ },永远不要使用它。隐藏异常不会让问题消失,这意味着您无法修复它们。其次,发布实际的完整异常文本,而不仅仅是消息。我怀疑您遇到了 DbConcurrencyException。如文本所述,当其他连接在实体加载和保存期间修改实体时,就会引发这种情况。第三,您没有发布表的架构(CREATE TABLE 语句、外键约束),所以必须猜测发生了什么 -
我的(相当有把握的)猜测——您从未将
Customer添加到数据库中,因此您不能只在Category.Customers中添加与它的关系。调用category.Customers.Add(customer);将一个条目添加到CategoryCustomers。为此,它需要Customers表中的有效相关条目,但此时不存在。在使用db.Customers.Add(customer);调用SaveChanges之前添加客户