我有一个向用户显示表单的视图,用户应该上传文件并选择与之关联的所有类别。
负责提交数据的控制器
检索文件信息和 在文件类别中插入数据
检索相关的类别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来进行插入,为什么我会向数据库发出另一个我不需要的请求
我正在使用
答案 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();
如果您知道数据库中存在所有类别,则此方案有效。如果要将新类别与保存文件一起插入,则需要先查询类别,或者添加一些有关哪个类别是新类别以及哪些类别存在的信息。