考虑以下情况:
public class Entity1
{
virtual public Int32 ID { get; set; }
[Required]
virtual public String Name { get; set; }
[Required]
virtual public Entity2 ReferenceToEntity2 { get; set; }
}
public class Entity2
{
virtual public Int32 ID { get; set; }
[Required]
virtual public String Name { get; set; }
virtual public IList<Entity1> ListOfEntity1 { get; set; }
}
[TestClass]
public class EntityFrameworkTests
{
[TestMethod]
public void Should_save_entity_with_reference_to_entity_with_required_fields()
{
using (var db = new MyContext())
{
var entity1 = new Entity1
{
Name = "My name",
ReferenceToEntity2 = new Entity2 { ID = 1 } // reference (Entity2 with ID=1) already exists in the database
};
db.Entity1List.Add(entity1);
db.SaveChanges(); // exception here
}
}
[TestMethod]
[ExpectedException(typeof(DbEntityValidationException))]
public void Should_not_save_empty_entity2_name()
{
using (var db = new MyContext())
{
var entity2 = new Entity2 { Name = "" };
db.Entity2List.Add(entity2);
db.SaveChanges();
}
}
}
第一次测试没有通过。引发DbEntityValidationException,在尝试保存Entity1实例时引用Entity2的Name属性。
我知道我可以通过ID加载entity2实例,并使用entity1.ReferenceToEntity2 = db.Entity2List.Find(entity2Id)将其关联。但实际上我有一个带有大量引用的实体,我不想只去数据库10次来关联外键!
是否可以将新的entity1实例插入到与现有entity2记录相关的数据库中,而无需转到数据库来检索entity2?
提前致谢!
答案 0 :(得分:2)
Attach
是针对这种情况制作的:
using (var db = new MyContext())
{
var entity1 = new Entity1
{
Name = "My name",
ReferenceToEntity2 = new Entity2 { ID = 1 }
// reference (Entity2 with ID=1) already exists in the database
};
db.Entity2List.Attach(entity1.ReferenceToEntity2); // must be BEFORE Add
db.Entity1List.Add(entity1);
db.SaveChanges();
}
它告诉EF,Entity2
= ID
已存在于数据库中。在Unchanged
之后,实体处于Attach
状态,并且EF不会向该实体的数据库发送任何UPDATE或INSERT语句。只更新entity1
中的外键。