实体框架在插入数据时存在多对多的关系瓶颈

时间:2011-02-24 11:47:33

标签: asp.net-mvc entity-framework

我有一个向用户显示表单的视图,用户应该上传文件并选择与之关联的所有类别。

负责提交数据的控制器

  • 检索文件信息和 在文件类别中插入数据

  • 检索相关的类别ID和 也可以在表中插入它们 这是由EF 抽象的 插入文件和类别ID。

这是我的问题,控制器只是得到一些关于类别的信息而不是全部。基本上它只需要插入的ID

我无法使用

        [HttpPost]
    public ActionResult SaveFile(File file, List<Category> Checkbox, HttpPostedFileBase FileUpload)
    {
        //some stuff
        //for example got the first category and named it to category1
        file.Categories.Add(category1)
    }

我问某人,他告诉我你必须选择你要插入的类别

这真的有必要吗?我只需要一个类别ID和一个文件ID来进行插入,为什么我会向数据库发出另一个我不需要的请求

Entities


我正在使用

  • EF 4
  • MVC 3

1 个答案:

答案 0 :(得分:2)

最好首先选择类别,因为它可以为您节省很多可能的问题但是没有必要。您可以使用虚拟类别对象:

  var category = new Category { Id = receivedId };
  file.Categories.Add(category);

您只会创建新类别,并且您将设置其PK。现在您需要处理文件插入,您必须明确指示ObjectContext仅插入文件(因为您的类别存在于数据库中):

context.Files.Attach(file); // now whole object graph is attached but marked as Unchanged
context.ObjectStateManager.ChangeObjectState(file, EntityState.Added); // mark only file entity as inserted
context.SaveChanges();

您也可以采取相反的方向:

context.Files.AddObject(file); // all objects in object graph are marked for insertion
foreach (var category in file.Categories)
{
  // you don't want to insert categories again
  context.ObjectStateManager.ChangeObjectState(category, EntityState.Unchanged); 
}
context.SaveChanges();

如果您知道数据库中存在所有类别,则此方案有效。如果要将新类别与保存文件一起插入,则需要先查询类别,或者添加一些有关哪个类别是新类别以及哪些类别存在的信息。