Entity Framework 6, Шаблон репозитория, Единица работы, Сохранить и получить последний идентификатор, а затем обновить запись - PullRequest
0 голосов
/ 21 февраля 2019

Я взял на себя веб-проект MVC, который использует EF6, шаблон репозитория, единицу работы.Я только начинаю изучать EF6.

Я хотел бы создать новую организацию и сохранить ее в базе данных, а затем получить новый идентификатор организации.Идентификатор новой организации будет использоваться для переименования файла изображения, который будет сохранен в organisation.logo.Затем обновите поле логотипа организации в базе данных, указав новое имя файла.

У меня есть сохранение организации, получение нового идентификатора организации, переименование файла, но я не могу обновить поле логотипа?

Код ниже:

Организационный контроллер - отображается базовый код. Я удалил много проверки и переименования файла изображения.

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 голосов
/ 21 февраля 2019

Поскольку вы не поделились своими методами UoW и Repository, мы не можем знать, что именно происходит в вашем коде.Тем не менее, я предоставил необходимый код, который делает то, что вам нужно, без учета репозитория и 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();
0 голосов
/ 21 февраля 2019

Вам нужно два вызова вашего метода [UOW.Save].Позвони первому, как ты.Когда вы это сделаете, объект, который вы сохранили, будет обновлен с его идентификатором, который был назначен в базе данных.Затем добавьте код, который берет этот Id и добавляет ваше имя файла, как вам нужно.Если это не сработает, значит, что-то не так с вашим UOW или репозиторием, что мешает его правильной работе.Кроме того, UOW и Repository являются «шаблонами», а не реализациями, поэтому мы не можем ожидать, как будет выглядеть этот код и как он работает, вам нужно быть более конкретным в отношении того, что именно вы делаете, если вам нужен вопросответил

...