表带有2个外键的实体框架

本文关键字:实体 框架 2个 | 更新日期: 2023-09-27 18:03:38

我有一个由2个外键组成的表。这些只是表中的元素。这个表是用来创建其他两个表之间的关联的。例如:表是Users_Products,只有2列是UserId和ProductID,都是外键。当我从数据库生成EF对象时,它没有创建Users_Products对象,它只自动创建导航属性。现在如何使用EF在Users_Products表中插入数据呢?

表带有2个外键的实体框架

你可以获取一些用户对象并将product添加到它的导航属性中。

User user = context.Users.Where(u => u.Id == 1);
Product product = context.Products.Where(p => p.Id == 1);
user.Products.Add(product);
context.SaveChanges();

有关显示如何在EF中使用多对多关系的代码示例,请参阅使用多对多关系一节实体框架4.0和ASP。. NET入门第5部分

即EF 4.0/Database First;有关使用DbContext API的示例,请参见在ASP中使用实体框架更新相关数据中的将课程作业添加到教师编辑页面。. NET MVC应用程序(6 of 10).

using ( var ctx = new ...)
{
  var user = new User();
  var product = new Product();
  user.Products.Add(product);
  ctx.Users.AddObject(user);
  ctx.SaveChanges();
}

如果你想创建关系(插入记录到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();