Код EF сначала с двумя DbContexts - PullRequest
0 голосов
/ 18 августа 2011

Сначала это должен быть простой код EF Code, но я не могу обернуться вокруг документации, и все примеры, которые я нахожу, взяты из более старых версий. Я работаю с последней (4.1).

В любом случае, у меня есть такие модели, как:

public class Foo
{
    public int ID { get; set; }
    public Bar Bar { get; set; }
}

public class Bar
{
    public int ID { get; set; }
    public string Value { get; set; }
}

Я использовал некоторые строительные леса в Asp.Net MVC для создания своих контроллеров / репозиториев, и когда я создаю объект 'Foo', он также создает объект 'Bar', даже если я установил свойство 'Bar' из чего-то, хранящегося в базы данных.

public class FooViewModel
{
    public int ID { get; set; }
    public int BarID { get; set; }
}

public ActionResult Create(FooViewModel foo)
{
    var entity = new Foo()
        {
            ID = foo.ID,
            Bar = _barRepository.Find(foo.BarID)
        };
    _fooRepository.InsertOrUpdate(entity);
    _fooRepository.Save();
    // more stuff
}

Как я могу использовать свободный синтаксис для EF, чтобы не дать ему создать новую строку 'Bar' в базе данных?

Обновление

Вот сгенерированный код репозитория:

    public void InsertOrUpdate(Foo foo)
    {
        if (foo.ID == default(int)) {
            // New entity
            context.Foo.Add(foo);
        } else {
            // Existing entity
            context.Foo(foo).State = EntityState.Modified;
        }
    }

    public void Save()
    {
        context.SaveChanges();
    }

Ответы [ 2 ]

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

ваши _fooRepository и _barRepository должны совместно использовать один и тот же экземпляр контекста БД. Если используются два экземпляра, Bar будет в добавленном состоянии.

0 голосов
/ 18 августа 2011

Проблема должна быть где-то на вашем уровне хранилища - использование той же модели напрямую с EF 4.1 дает ожидаемый результат - новая строка в таблице Foos с столбцом FK столбца, указывающим на существующий столбец.

...