延迟实体框架SaveChanges到下一个操作

时间:2014-03-02 14:50:07

标签: c# jquery asp.net-mvc entity-framework

我有一个表单,用户可以使用jquery插入项目的照片。

我无法在用户上传图像时保存图像,因为尚未创建项目导致外键冲突。

我创建了一个basecontroller,itemcontroller和fileuploadcontroller都继承了。在这个basecontroller中,创建了一个新的DBContext对象。

我填写用户在此共享DBContext中上传的图像,当用户最终提交表单时,项目被创建并保存(在其自己的DBContext中),然后我尝试使用共享的DBContext保存图像。

问题在于,此时我之前添加的图像不再存在于DBContext中,因此图像不会保存在数据库中。

我做错了什么?我可以删除外键来解决问题,但我认为不是好主意。

1 个答案:

答案 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