我有一个问题。我以这种方式将对象添加到表中:
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; }
}
答案 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; }
}