0

考虑以下情形:在Entity Framework 4.1中,是否可以将两个实体关联而不从数据库中检索它们?

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?

在此先感谢!

回答

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是Entity2ID = 1已经存在于数据库中。该实体在Attach之后处于Unchanged状态,并且EF不会向该实体的数据库发送任何UPDATE或INSERT语句。只需更新entity1中的外键即可。

+0

它的工作原理! :) 非常感谢你 – ThiagoAlves

相关问题