实体框架6,存储库模式,工作单元,保存并获取上一个ID,然后更新记录

时间:2019-02-21 10:58:52

标签: entity-framework-6 repository-pattern unit-of-work

我已经接管了一个使用EF6,存储库模式,工作单元的MVC Web项目。我才刚刚开始学习EF6。

我想创建一个新的组织并将其保存到数据库中,然后获取新的组织ID。新的组织ID将用于重命名将存储在Organisation.logo中的图像文件。然后使用新文件名更新数据库中的组织徽标字段。

我保存了组织,获取了新的组织ID,重命名了文件,但无法获取徽标字段进行更新?

以下代码:

组织控制器-显示了基本代码,我已删除了大量验证并重命名图像文件。

public ActionResult Create(OrganisationViewModel viewModelToCreate)
    {

        Organisation newOrganisation = new Organisation();
        newOrganisation.Name = viewModelToCreate.Name;
        newOrganisation.Logo = "To Change";

        _Uow.OrganisationRepository.InsertOrUpdate(newOrganisation);

        if (ModelState.IsValid)
        {
            _Uow.Save();
            int newOrganisationId = _Uow.OrganisationRepository.LastInsertedID();
            Organisation organisationToUpdate = _Uow.OrganisationRepository.Find(newOrganisationId);
string fileName = newOrganisationId.ToString() + Path.GetExtension(viewModelToCreate.FileNameToAdd.FileName);

                organisationToUpdate.Logo = fileName;
                _Uow.OrganisationRepository.InsertOrUpdate(organisationToUpdate);
                _Uow.Save();
            }

    }


public virtual T InsertOrUpdate(T e)
    {
        DbSet<T> dbSet = Context.Set<T>();

        DbEntityEntry<T> entry;
        if (e.ID != default(int))
        {
            entry = Context.Entry(e);

        }
        else
        {
            T instance = dbSet.Create();
            instance.ID = e.ID;
            entry = Context.Entry(instance);
            dbSet.Attach(instance);
            entry.CurrentValues.SetValues(e);
            e = instance;
        }

        entry.State = e.ID == default(int) ?
                                EntityState.Added :
                                EntityState.Modified;

        return e;
    }


     int IUnitOfWork.Save()
        {

                return _Context.SaveChanges();
     }

      public int LastInsertedID()
         {
             Context = new aContext();
             int newOrganisationId = Context.Organisations.OrderByDescending(x => x.ID).FirstOrDefault().ID;
             return newOrganisationId;
    }

如何用新的文件名更新organisationToUpdate.Logo,它不保存到数据库中?

2 个答案:

答案 0 :(得分:1)

由于您尚未共享UoW和存储库方法,因此我们无法知道代码中到底发生了什么。但是,我提供了所需的代码,可以满足您的需要,而无需考虑存储库和UoW。只需检查您的代码是否在执行以下操作即可:

var db = new AppDbContext();

// inserting new organization
Organisation newOrganisation = new Organisation();
newOrganisation.Name = viewModelToCreate.Name;
newOrganisation.Logo = "To Change";
db.Organisation.Add(newOrganisation);
db.SaveChanges();

// updating the inserted organization
string fileName = ”New FileName”;
newOrganisation.Logo = fileName;
db.SaveChanges();

答案 1 :(得分:0)

您需要两次调用[UOW.Save]方法。像你一样叫第一个。完成此操作后,保存的实体将使用在数据库中分配的ID更新。然后添加带有该ID的代码,并根据需要将其附加到文件名中。如果这不起作用,则您的UOW或存储库出现问题,导致其无法正常工作。顺便说一句,UOW和存储库是“模式”而不是实现,因此我们不能期望知道代码的外观以及它的工作方式,如果需要,您需要更确切地说明正在执行的操作回答