使用Entity Frameworks Core将成员添加到虚拟集合



我正试图将Customer添加到CustomerCategoryCustomers集合,但引发了异常,消息为

数据库操作预计影响1行,但实际影响了0行。自实体加载。

我在.NET 5.0类库中使用Microsoft.EntityFrameworkCore.Sqlite Version 5.0.0Microsoft.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);
}

在以下代码段中调用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)
{ }
}
}

如何使用实体框架核心将成员添加到虚拟集合?

首先,不要使用catch(Exception exc){}。这只会使问题更难发现和解决。

在存储更改之前,将新的Customer对象添加到数据库中。在新客户对象上设置类别,而不是反过来:

Customer customer = new();
customer.FileAs = "Fred-1";
customer.Category=category;
db.Customers.Add(customer);
db.SaveChanges(); 

您可以通过直接设置CategoryID来避免完全加载类别:

using DataContext db = new();
Guid cat1Guid = new Guid("FA754EE8-B343-4E0B-9A11-AA066E4678C0");
Customer customer = new() 
{
CategoryID=cat1Guid,
FileAs = "Fred-1"
};
db.Customers.Add(customer);
db.SaveChanges();

调用category.Customers.Add(customer);告诉EF这两个实体是相关的,它不会创建新的相关实体。在客户端,EF无法知道Customer是新对象还是现有对象,尤其是,因为它有一个非默认ID。那个调用只是要求EF更新Customer的类别还是插入一个新的类别?没有办法知道。

最新更新