2011-07-25 33 views
2

我有一个由2个外键组成的表。而这些只是桌子上的元素。该表旨在创建2个其他表之间的关联。例如:表是Users_Products,并且只有2列是UserId和ProductID,都是外键。当我从数据库生成EF对象时,它不会创建Users_Products对象,它只会自动创建导航属性。现在如何使用EF在我的Users_Products表中插入数据?带有2个外键实体框架的表

回答

5

您可以获取一些用户对象并将产品添加到其导航属性中。

User user = context.Users.Where(u => u.Id == 1); 
Product product = context.Products.Where(p => p.Id == 1); 
user.Products.Add(product); 
context.SaveChanges(); 
1
using (var ctx = new ...) 
{ 
    var user = new User(); 
    var product = new Product(); 
    user.Products.Add(product); 
    ctx.Users.AddObject(user); 
    ctx.SaveChanges(); 
} 
+0

难道只是将新项目添加到产品表? – m0s

+1

user.Products.Add(product)将在Users_Products表中添加条目。顺便说一句,如果您在此表中添加另一列(FK除外),EF也会为此表创建一个EntityType。 –

1

如果你想创建关系(插入记录到User_Products表),你只需要使用导航属性无论是在UserProduct

user.Products.Add(product); 

product.Users.Add(user); 

这意味着您至少必须具有导航属性才能创建关系。如果你已经加载了当前比赛的实体,你可以使用@Pavel描述的方法。

如果不装入实体,或者如果你不想做两次查询数据库只是为了让一个关系,你可以使用此解决方法:

// Make dummy objects for records existing in your database 
var user = new User() { Id = 1 }; 
var product = new Product() { Id = 1 }; 
// Ensure that your context knows instances and does not track them as new or modified 
context.Users.Attach(user); 
context.Products.Attach(product); 
// Again make relation and save changes 
user.Products.Add(product); 
ctx.SaveChanges();