首页 > 解决方案 > 将一个对象分配给另一个对象时是否设置了 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();
}

标签: c#entity-framework-core

解决方案


(您可以在调试器中检查您的问题的答案,或者使用您提供的代码进行简单测试。)

当我将一个实体分配给另一个实体时,是否会自动设置相应的 ID [在稍后调用 SaveChanges 之前?]

不,他们不是。原因是,您在此处的导航属性实际上只是 POCO 属性(即简单的 .NET 属性)。该Assets.Persons属性实际上只是一个类型的属性,Persons并且该Persons.Assets属性实际上仅包含HashSet<Assets>您在构造函数中分配的实例。这里没有魔法。

在更改跟踪期间,ID 会自动同步,例如在SaveChanges()调用时会发生这种情况,但也可以通过调用手动触发context.ChangeTracker.DetectChanges()


作为旁注,请注意,如果您对主键使用身份/自动递增列,则不应在代码中显式设置 ID,因为这可能会导致保存时出现异常(取决于所使用的数据库服务器),因为到 EF Core 尝试将显式分配的 ID 插入标识/自动增量列(例如,默认情况下 SQL Server 不允许这样做)。


推荐阅读