2016-01-23 84 views
0

我有一个对象有两个子对象: 对象是一个客户。其中一个子对象是一个国家,例如:customer.Country = country; 国家表格不可更改。顾客表是可变的。 我尝试添加使用EF一个新的客户:添加与子对象的对象

Context.Customers.Attach(customer); 
Context.Entry(customer).State = EntityState.Added;   
var newEntry = DbSet.Add(customer); 
return Context.SaveChanges() > 0 

而且它的第testings期间正常工作。但是由于一些奇怪的原因,它不再起作用了:它说子对象已经存在于数据库中。 这段代码有什么问题,请指教?

PS 我已经解决了与下面的代码这个问题:

Context.Countries.Attach(customer.Country); 
var newEntry = DbSet.Add(customer); 
Context.SaveChanges(); 

但我不能完全肯定,如果这是正确的

PPS 只需再次测试了第二种方法,它失败了,虽然它工作得很好......这很奇怪......

+0

第二种方法出现错误吗? –

回答

0

如果你添加一个带有子元素的元素,子元素也会被添加到数据库中。如果您添加一个新的客户使用相同的子元素,EF将尝试再次添加子元素,这会(当然会失败)。

如果你有一个子元素,需要被分配到一个新的元素(例如国家对客户),你需要从数据库中加载的子元素是这样的:

Country country = Context.Countries.Find(countryId); 
customer.Country = country; 
Context.Customers.Add(customer); 
Context.SaveChanges(); 
+0

我知道这种方法,但我认为这是错误的。我们应该使用附件或国家的东西 –

+0

为什么这是错的? 'Add'在集合中添加一个新元素,并在内部设置要附加的状态。 –

+0

恐怕它会被认为是不好的代码,这是我试图避免的东西 –

0

要将一个对象添加到entityframework中的表中,您可以执行以下任一操作。

var country = Context.Countries.First(x => x.Id == 1); 
customer.Country = country; 

Context.Customers.Add(customer); 

刚刚致电Context.SaveChanges()并将实体添加到数据库中。

+0

不,它会在对象没有子对象时起作用。就我而言,我无法添加子对象的副本。 –

+0

@ J.Doe我刚刚更新了我的答案,以保存客户与国家 –

+0

恐怕这将被视为错误的代码。我发现有必要使用附加/状态的东西,但由于一些奇怪的原因,它们只能工作一次...... –