我有一个表单,用户可以使用jquery插入项目的照片。
我无法在用户上传图像时保存图像,因为尚未创建项目导致外键冲突。
我创建了一个basecontroller,itemcontroller和fileuploadcontroller都继承了。在这个basecontroller中,创建了一个新的DBContext对象。
我填写用户在此共享DBContext中上传的图像,当用户最终提交表单时,项目被创建并保存(在其自己的DBContext中),然后我尝试使用共享的DBContext保存图像。
问题在于,此时我之前添加的图像不再存在于DBContext中,因此图像不会保存在数据库中。
我做错了什么?我可以删除外键来解决问题,但我认为不是好主意。
答案 0 :(得分:0)
我会避免每个请求使用多个上下文(如果可能),或者至少一次只使用一个上下文。我肯定会避免在基本控制器类中创建共享DBContexts。实际上,我完全避免在表示层中使用EF代码。 我更喜欢有一个“业务逻辑”层或“服务”层(后者是一个重载的术语),然后我用它来调用存储库层。但为了简单起见,只需要一层就可以了。 您可以制作 all new的相关实体的图表,并立即添加它们。 EF会将它们全部插入。但是,不要尝试使用此过程插入已存在的子实体。它总是会尝试添加附加到此图表的实体。
对于尚未存在的上传图像,我将使用上传的数据填充新实体,并将其添加到上下文的新实例中。然后,我会在那时就上下文调用SaveChanges()
。
新服务类:
public class ItemService
{
public ItemEntity AddItem(ItemEntity e)
{
if (e != null)
{
using (var context = new MyContext())
{
IDbSet<ItemEntity> entitySet = context.Set<ItemEntity>();
var entity = entitySet.Add(e);
context.SaveChanges();
return entity;
}
}
return null;
}
}
初始化图表并添加新实体及其相关实体的代码:
// gather the images into their respective entities, say Image1 and Image2 for an example
var Image1 = new ImageEntity { // set the properties here };
var Image2 = new ImageEntity { // set the properties here };
var newItem = new ItemEntity
{
// set various scalar properties here
Images = {
Image1, Image2
}
};
var service = new ImageService();
var addedEntity = service.AddItem(newItem); // adds and commits