2014-02-19 46 views
0

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

对象 '车' 扩展

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

这里发生了两件事。首先,如果你从上下文中检索“模式”,你是在这一行:

this.model = db.models.FirstOrDefault(m => m.brand == brand && m.model == model) 

然后当它是由实体框架检索的对象会自动连接。如果你只是创建它:

this.model = new model() 

然后它不是默认附加,你需要调用正常的上下文添加方法。

+0

但是,对于现有的模型,它被提取(1st),而不是创建(2th)。因此,如果它被连接,它为什么还在我的数据库中添加一个新的模型(具有相同的属性)? –

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