使用EF6.0& .NET 4.5。 我有一些部分扩展我的框架对象。
一个人有多辆车。这些汽车有一个型号/品牌(与其他汽车共享):
table person: id, name, whatever, ..
table car: id, personId, modelId, hasCrashedManyTimes, ..
table model: id, brand, model, hasWheels, hasEngine, ..
在我的主程序中我做了
using(var db = My.EntityContext()) // get connection from pool
{
var person = new person();
person.cars.Add(new car("Ford", "Focus"));
db.persons.Add(person);
db.SaveChanges();
}
对象'car'已扩展
public car(string brand, string model) : this()
{
using(var db = My.EntityContext()) {
this.model = db.models.FirstOrDefault(m => m.brand == brand && m.model == model)
if(this.model == null) this.model = new model() { brand = brand, model = model };
}
}
这有效但我没想到的是每次都会添加'模型'。我搜索并应用的模型并非“附加”。
有人知道我在做什么吗? 为什么会发生这种情况以及如何正确地做到这一点?
答案 0 :(得分:0)
这里发生了两件事。首先,如果您从上下文中检索“模型”,就像您在这一行中一样:
this.model = db.models.FirstOrDefault(m => m.brand == brand && m.model == model)
然后,当实体框架检索到对象时,该对象将自动附加。如果您只是创建它:
this.model = new model()
然后默认不附加它,你需要调用普通的上下文Add方法。
答案 1 :(得分:0)
显然我需要坚持相同的背景。这解决了我的问题:
using(var db = My.EntityContext()) // get connection from pool
{
var person = new person();
person.cars.Add(new car(db, "Ford", "Focus"));
db.persons.Add(person);
db.SaveChanges();
}
public car(Entities db, string brand, string model) : this()
{
this.model = db.models.FirstOrDefault(m => m.brand == brand && m.model == model)
if(this.model == null) this.model = new model() { brand = brand, model = model };
}