c# - 将一个对象分配给另一个对象时是否设置了 DBSet<> 对象的 ID?
问题描述
我有两个实体,在数据库中具有一对多的关系,以及通过对数据库进行逆向工程生成的相应类。
public partial class Assets
{
public int AssetsId { get; set; }
public string Description { get; set; }
public int? PersonId { get; set; }
public virtual Persons Person { get; set; }
}
public partial class Persons
{
public Persons()
{
Assets = new HashSet<Assets>();
}
public int PersonId { get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
public virtual ICollection<Assets> Assets { get; set; }
}
当我将一个实体分配给另一个实体时,是否会自动设置相应的 ID(我很好奇它们是否在调用 SaveChanges 之前设置,所以我可以在不提交所有当前更改的情况下使用它)。
static void Main(string[] args)
{
Context c = new Context();
var a = new Assets();
a.AssetsId = 1;
var p = new Persons();
p.PersonId = 2;
c.Add(a);
c.Add(p);
a.Person = p; //does it set a.PersonId = 2
p.Assets.Add(a); //does it set a.PersonId = 2
c.SaveChanges();
}
解决方案
(您可以在调试器中检查您的问题的答案,或者使用您提供的代码进行简单测试。)
当我将一个实体分配给另一个实体时,是否会自动设置相应的 ID [在稍后调用 SaveChanges 之前?]
不,他们不是。原因是,您在此处的导航属性实际上只是 POCO 属性(即简单的 .NET 属性)。该Assets.Persons
属性实际上只是一个类型的属性,Persons
并且该Persons.Assets
属性实际上仅包含HashSet<Assets>
您在构造函数中分配的实例。这里没有魔法。
在更改跟踪期间,ID 会自动同步,例如在SaveChanges()
调用时会发生这种情况,但也可以通过调用手动触发context.ChangeTracker.DetectChanges()
。
作为旁注,请注意,如果您对主键使用身份/自动递增列,则不应在代码中显式设置 ID,因为这可能会导致保存时出现异常(取决于所使用的数据库服务器),因为到 EF Core 尝试将显式分配的 ID 插入标识/自动增量列(例如,默认情况下 SQL Server 不允许这样做)。
推荐阅读
- iphone - 检索设备设置后更新 UI
- iphone - 调用 AVAudioEngine.inputNode 时蓝牙耳机断开连接
- oauth - ADFS 3.0 和 JWT 令牌
- xml - XML 到字符串 PowerShell
- java - 如何使用 Hibernate 在 HQL 中使用子查询
- java - 使用 CSVParser 和 Formatter 返回记录列表
- ruby - 删除某些字符之间的子字符串
- github - Google Colab:使用来自 GitHub 的函数 .py
- angular5 - TypeError:在角度 5 中进行单元测试时无法读取未定义问题的属性“路径”
- ubuntu - 在容器中绑定挂载 /proc 或 /dev 导致操作不允许错误