C# 是DBSet<&燃气轮机;对象';在将一个ID分配给另一个ID时设置了哪些ID?

C# 是DBSet<&燃气轮机;对象';在将一个ID分配给另一个ID时设置了哪些ID?,c#,entity-framework-core,C#,Entity Framework Core,我有两个实体,它们在数据库中的关系是一个多个,对应的类是通过反向工程数据库生成的 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

我有两个实体,它们在数据库中的关系是一个多个,对应的类是通过反向工程数据库生成的

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之前?]

不,他们不是。原因是,这里的导航属性实际上只是POCO属性(意味着简单的.NET属性)。
Assets.Persons
属性实际上只是
Persons
类型的属性,
Persons.Assets
属性实际上只包含在构造函数中分配的
HashSet
实例。这里没有魔法

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



作为旁注,请注意,如果您对主键使用identity/auto increment列,则不应在代码中显式设置ID,因为由于EF Core试图将显式分配的ID插入identity/auto increment列,这可能导致保存时出现异常(取决于所使用的数据库服务器)(例如,默认情况下,SQL Server不允许这样做)答案:是的。避免直接操纵ID。此外,密钥通常是自动生成的。在执行上下文的SaveChanges之前,不会进行外键更改。有人知道如何解决此问题吗?如果是这样的话,更改它将是危险的。为什么需要ID?您的示例是精心设计的,因为您是手动指定主键。是的,这是人为的。我必须简化我的项目。我的想法是从上下文中检索一个对象,一个是新的。然后我需要知道在调用SaveChanges之前是否更新了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();
}