EntityFramework,将对象ID添加到表中

时间:2019-04-18 07:00:45

标签: c# entity-framework linq

我有一个问题。我以这种方式将对象添加到表中:

this.db.Objects.Add(new Object { Text = "someText", Number = number });

然后,我想将第二个对象添加到与Objects表相关的另一个表中(表名称为Objects3

this.db.Objects3.Add(new Object3 { ObjectId = ?, Property = "text" });

如何仅基于Object的属性获取Object.Id(表格中的ID为int类型)?

表如下:

public class Object
{
    [Key]
    public int Id { get; set; }

    [ForeignKey("Object2")]
    public int Object2Id { get; set; }
    public Object2 Object2 { get; set; }

    public string Text { get; set; }
    public int Number { get; set; }

    public List<Object3> Objects3 { get; set; }
}

public class Object3
{
    [Key]
    public int Id { get; set; }

    [ForeignKey("Object")]
    public int ObjectId { get; set; }
    public Object Object { get; set; }

    public string Property { get; set; }
}

1 个答案:

答案 0 :(得分:2)

您实际上并不需要ID值来创建两个实体之间的关系,这是ORM对导航属性的支持变得很方便的地方:

var o1 = new Object() { ...
var o3 = new Object3() { ...

o3.Object = o1;

this.db.Objects3.Add( o3 );

this.db.SaveChanges();

EF应该注意到您的导航属性在另一端有一个对象,并按照正确的顺序将它们保存到数据库中,并相应地设置了两个ID。

但是,如果您坚持以明确的方式拥有ID,则应首先保存更改,以便在对象中设置ID

var o1 = new Object() { ...
this.db.Objects.Add( o1 );

this.db.SaveChanges(); 

var id = o1.ID;

现在,您可以显式使用ID。

一个旁注-您的导航属性缺少virtual修饰符,这将使EF无法用延迟加载替换默认实现,以免对数据库执行查询时具体化的对象。

public class Object
{
    public Object()
    {
        this.Objects3 = new List<Object3>();
    }

    public virtual ICollection<Object3> Objects3 { get; set; }
}

public class Object3
{
    public virtual Object Object { get; set; }

}