是否可以在不从Entity Framework 4.1中的数据库中检索它们的情况下关联两个实体?

时间:2011-08-25 19:45:21

标签: validation entity-framework-4 ef-code-first data-annotations

考虑以下情况:

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?

提前致谢!

1 个答案:

答案 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中的外键。