2011-02-24 76 views
1

我有一个视图向用户显示一个表单,用户应该上传一个文件并选择与之相关的所有类别。实体框架多对多插入数据时的关系瓶颈

控制器,它负责在提交的数据应该

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

  • 检索相关类别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

回答

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(); 

这种情况作品如果您知道数据库中存在所有类别。如果您想通过保存文件将新类别一起插入,则需要先查询类别或添加有关哪些类别是新的和哪些类别存在的信息。

+0

我还是想在抽象实体“CategoryFile”所以,当我尝试你的方法的结果是一个例外'无法更新EntitySet的“CategoryFile”,因为它有一个DefiningQuery并没有元素中是否存在插入一行元素支持当前的操作。@ – 2011-02-24 13:17:58

+1

@Nadeem:在这种情况下,您的数据模型被错误地定义。对于EF,类别和文件之间的联结表是只读的。您可能在该表中缺少主键。 – 2011-02-24 13:21:52

+0

真的你是天才:D,那帮了ALOT,谢谢 – 2011-02-24 14:32:48