Действие редактирования не записывает указанный идентификатор ApplicationUser в БД в коде MVC - PullRequest
0 голосов
/ 10 января 2019

Я ссылался на модель ASP.NET Identity ApplicationUser во всех моих таблицах (LastUpdatedByUser)

Когда я пытаюсь установить его как текущего пользователя в методе Edit, свойство объекта устанавливается правильно, но сгенерированный SQL не включает LastUpdateByUser_Id в запросе UPDATE.

Свойство модели:

public class ConsignmentStatus
{
//...

[Required]
[Display(Name = "UpdatedBy", ResourceType = typeof(Resources.Resources))]
public ApplicationUser LastUpdatedByUser { get; set; }
}

Редактировать действие на контроллере:

 [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Edit([Bind(Include = "ID,Code,Name,Description,IsTruckInbound,IsRailInbound,IsVesselOutbound,IsCarImport,IsBulkImport,IsTruckOutbound,NameLocal,LastUpdatedByUser")] ConsignmentStatus consignmentStatus)
    {
        var userManager = new ApplicationUserManager(new UserStore<ApplicationUser>(db));
        var _user = (from u in db.Users
                     where u.UserName == User.Identity.Name
                     select u).First();

        consignmentStatus.LastUpdatedByUser = _user;

        ModelState.Clear();
        TryValidateModel(consignmentStatus);

        if (ModelState.IsValid)
            {
                db.Entry(consignmentStatus).State = EntityState.Modified;
                await db.SaveChangesAsync();
                return RedirectToAction("Index");
            }
         return View(consignmentStatus);
    }

Чего мне не хватает? Я перепробовал все!

Вот запрос, который он генерирует. Обратите внимание на отсутствующий LastUpdatedByUser_Id:

UPDATE [dbo].[ConsignmentStatus]
SET [Code] = @0, [Name] = @1, [NameLocal] = @2, [Description] = NULL, 
[IsTruckInbound] = @3, [IsRailInbound] = @4, [IsVesselOutbound] = @5, 
[IsCarImport] = @6, [IsBulkImport] = @7, [IsTruckOutbound] = @8, 
[LastUpdatedDateTime] = @9, [Deleted] = @10
WHERE ([ID] = @11)

-- @0: 'WA' (Type = String, Size = -1)
-- @1: 'Wagons Arrived' (Type = String, Size = -1)
-- @2: '1232412312' (Type = String, Size = -1)
-- @3: 'False' (Type = Boolean)
-- @4: 'True' (Type = Boolean)
-- @5: 'False' (Type = Boolean)
-- @6: 'False' (Type = Boolean)
-- @7: 'False' (Type = Boolean)
-- @8: 'False' (Type = Boolean)
-- @9: '10/01/2019 12:29:32' (Type = DateTime2)
-- @10: 'False' (Type = Boolean)
-- @11: '24' (Type = Int32)

1 Ответ

0 голосов
/ 10 января 2019

Как и , как вы сказали ваш класс ConsignmentStatus не содержит никаких свойств ForeigKey для LastUpdatedByUser навигации, поэтому сначала обновите ваш класс ConsignmentStatus следующим образом:

public class ConsignmentStatus
{
     //...

    [ForeignKey("LastUpdatedByUser")]
    public string LastUpdatedByUserId { get; set; } // type should be the type of `ApplicationUser` primary key. But I have put it string here.

    [Required]
    [Display(Name = "UpdatedBy", ResourceType = typeof(Resources.Resources))]
    public ApplicationUser LastUpdatedByUser { get; set; }
}

Теперь обновите базу данных соответственно.

Затем попробуйте назначить userId для LastUpdatedByUserId вместо назначения LastUpdatedByUser для свойства навигации LastUpdatedByUser следующим образом:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Edit([Bind(Include = "ID,Code,Name,Description,IsTruckInbound,IsRailInbound,IsVesselOutbound,IsCarImport,IsBulkImport,IsTruckOutbound,NameLocal,LastUpdatedByUser")] ConsignmentStatus consignmentStatus)
{
    ModelState.Clear();
    TryValidateModel(consignmentStatus);

    if (ModelState.IsValid)
    {
        var loggedinUserId = User.Identity.GetUserId();

        consignmentStatus.LastUpdatedByUserId = loggedinUserId; // assgin userId to `LastUpdatedByUserId` in `consignmentStatus`

        db.Entry(consignmentStatus).State = EntityState.Modified;
        await db.SaveChangesAsync();
        return RedirectToAction("Index");
    }
    return View(consignmentStatus);
}

Надеюсь, теперь это сработает!

...