EF代码优先使用两个DbContexts

时间:2011-08-18 03:56:43

标签: entity-framework asp.net-mvc-3 ef-code-first fluent

这应该是一个简单的涉及EF代码,但我无法理解文档,我发现的所有示例都来自旧版本。我正在使用最新的(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 个答案:

答案 0 :(得分:2)

您的_fooRepository和_barRepository需要共享相同的DB上下文实例。如果使用两个实例,Bar将处于添加状态。

答案 1 :(得分:0)

问题必须在您的存储库层中的某个位置 - 直接使用与EF 4.1相同的模型产生预期结果 - Foos表中的新行,其中FK列指向现有Bar。