Можно ли связать две сущности, не извлекая их из базы данных в Entity Framework 4.1? - PullRequest
0 голосов
/ 25 августа 2011

Рассмотрим следующий сценарий:

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, ссылаясь на свойство Name Entity2 при попытке сохранить экземпляр Entity1.

Я знаю, что мог бы загрузить экземпляр entity2 по ID и связать его с помощью entity1.ReferenceToEntity2 = db.Entity2List.Find (entity2Id)), например.Но на самом деле у меня есть сущность с множеством ссылок, и я не хочу заходить в базу данных только 10 раз, чтобы связать внешний ключ!

Можно ли вставить в базу данных новый экземпляр entity1, относящийся ксуществующая запись entity2 без необходимости обращаться к базе данных для получения entity2?

Заранее спасибо!

1 Ответ

2 голосов
/ 26 августа 2011

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 = 1 уже существует в базе данных. После Attach объект находится в состоянии Unchanged, и EF не будет отправлять в базу данных какие-либо операторы UPDATE или INSERT для этого объекта. Просто внешний ключ в entity1 обновляется.

...