附加没有上下文的实体框架对象?

时间:2014-02-19 13:37:01

标签: c# entity-framework

使用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 };
    }
}    

这有效但我没想到的是每次都会添加'模型'。我搜索并应用的模型并非“附加”。

有人知道我在做什么吗? 为什么会发生这种情况以及如何正确地做到这一点?

2 个答案:

答案 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 };
}