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
之前添加客户代码>