这应该是一个简单的涉及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();
}
答案 0 :(得分:2)
您的_fooRepository和_barRepository需要共享相同的DB上下文实例。如果使用两个实例,Bar
将处于添加状态。
答案 1 :(得分:0)
问题必须在您的存储库层中的某个位置 - 直接使用与EF 4.1相同的模型产生预期结果 - Foos
表中的新行,其中FK列指向现有Bar。