Entity framework core 使用实体Framerwork Core将成员添加到虚拟集合

Entity framework core 使用实体Framerwork Core将成员添加到虚拟集合,entity-framework-core,Entity Framework Core,我正试图将客户添加到客户的客户分类集合中,但消息中会引发异常 数据库操作预期影响1行,但实际影响0行 世界其他地区。自实体被删除后,数据可能已被修改或删除 上膛了 我在.NET 5.0类库中使用Microsoft.EntityFrameworkCore.Sqlite版本5.0.0Microsoft.EntityFrameworkCore.Proxies版本5.0.0 我试图简化这些类来帮助识别错误的原因,但没有成功。这就是我目前所拥有的 public class Customer { p

我正试图将
客户
添加到
客户
客户分类
集合中,但消息中会引发异常

数据库操作预期影响1行,但实际影响0行 世界其他地区。自实体被删除后,数据可能已被修改或删除 上膛了

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

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

首先,切勿使用
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(客户)告诉EF这两个实体是相关的,它不会创建新的相关实体。在客户端,EF无法知道
Customer
是新对象还是现有对象,尤其是因为它有一个非默认ID。该调用是否只是要求EF更新
客户的类别或插入一个新的类别?没有办法知道。

首先,不要使用
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(客户)告诉EF这两个实体是相关的,它不会创建新的相关实体。在客户端,EF无法知道
Customer
是新对象还是现有对象,尤其是因为它有一个非默认ID。该调用是否只是要求EF更新
客户的类别或插入一个新的类别?没有办法知道。

首先删除
catch(Exception ex){}
并永远不要使用它。隐藏异常不会使问题消失,它意味着您无法修复它们。其次,发布实际的完整异常文本,而不仅仅是消息。我怀疑你有个例外。正如文本所说,当其他连接在加载实体和保存实体之间修改实体时,就会抛出该错误。第三,您没有发布表的模式(CREATE TABLE语句、外键约束),因此您必须猜测发生了什么事我(非常自信)猜测-您从未将
Customer
添加到数据库中,因此您不能只在
Category.Customers
中添加与它的关系。调用
category.Customers.Add(客户)将条目添加到
类别客户
。为此,它需要
Customers
表中的有效相关条目,但此时不存在任何条目。使用
db.Customers.Add(customer)调用
SaveChanges
之前添加客户
首先删除
catch(Exception ex){}
并永远不要使用它。隐藏异常不会使问题消失,它意味着您无法修复它们。其次,发布实际的完整异常文本,而不仅仅是消息。我怀疑你有个例外。正如文本所说,当其他连接在加载实体和保存实体之间修改实体时,就会抛出该错误。第三,您没有发布表的模式(CREATE TABLE语句、外键约束),因此您必须猜测发生了什么事我(非常自信)猜测-您从未将
Customer
添加到数据库中,因此您不能只在
Category.Customers
中添加与它的关系。调用
category.Customers.Add(客户)将条目添加到
类别客户
。为此,它需要
Customers
表中的有效相关条目,但此时不存在任何条目。使用
db.Customers.Add(customer)调用
SaveChanges
之前添加客户