簡體   English   中英

無法將ApplicationUser字段添加到通過EF Core創建的數據庫中的多個記錄中

[英]Unable to add ApplicationUser field to more than one record in database created through EF Core

我的類分包商有一個屬性ApplicationUser CreatedUser。 創建分包商並將其添加到數據庫后,我想將當前的IdentityUser存儲為CreatedUser。 我使用EF Core Migrations創建了數據庫。 添加遷移時,默認情況下,CreatedUser作為外鍵映射到數據庫中的CreatedUserId。

當我運行我的應用程序時,由登錄用戶添加的第一個分包商記錄工作正常,並且CreatedUserId字段已更新。 我的問題是,一旦用戶嘗試創建第二個分包商記錄,我就會遇到未捕獲的異常。 如果刪除更新CreatedUser字段,則可以正常工作,並且可以添加多個分包商記錄。

這使我相信我需要在OnModelCreating中添加自己的關系配置以覆蓋默認的EF遷移配置? 我不確定是否需要指定什么以便分包商數據庫表將接受具有相同CreatedUserId字段的多個記錄? 或者,默認關系是否正確,是否需要在我的create方法中進行某些更改以進行修復?

默認情況下,這是EF Core Migrations創建的內容:

modelBuilder.Entity("SubTracker.Data.Models.Subcontractor", b =>
{
   b.HasOne("SubTracker.Data.Models.ApplicationUser", "Approver")
       .WithMany()
       .HasForeignKey("ApproverId");

   b.HasOne("SubTracker.Data.Models.ApplicationUser", "CreatedUser")
        .WithMany()
        .HasForeignKey("CreatedUserId");
});

配對下來,我的課是:

 public class Subcontractor
 {
    public long Id { get; set; }
    public string Name { get; set; }
    public string AddressLineOne { get; set; }
    public string AddressLineTwo { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public ApplicationUser CreatedUser { get; set; }
}

在我的控制器中,我的創建方法是:

private Task<ApplicationUser> GetCurrentUserAsync() => _userManager.GetUserAsync(HttpContext.User);

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,Name,AddressLineOne,AddressLineTwo,City,State,Zipcode,ContactName,ContactEmail,ContactPhone")] Subcontractor subcontractor)
{
   if (ModelState.IsValid)
   {
     var user = await GetCurrentUserAsync();

     subcontractor.CreatedTimestamp = DateTime.Now;
     subcontractor.UpdatedTimestamp = subcontractor.CreatedTimestamp;
     subcontractor.AnnualSafetyPrequalApproved = false;
     subcontractor.AnnualInsuranceApproved = false;
     subcontractor.Status = "In Process";
     subcontractor.CreatedUser = user;

     _context.Add(subcontractor);

     await _context.SaveChangesAsync();

     return RedirectToAction(nameof(Index));
   }
   return View(subcontractor);
}

我的ApplicationUser類:

public class ApplicationUser : IdentityUser
{
    public string Branch { get; set; }
    public string Area { get; set; }
    public string Title{ get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }        
    public string Role { get; set; }
 }

對於身份和應用程序數據,我有單獨的數據庫上下文。 我配對的DBContext(刪除了其他模型類,但對ApplicationUser則沒有任何內容)是:

public class SubTrackerDbContext : DbContext
{
    public DbSet<Subcontractor> Subcontractors { get; set; }

    public SubTrackerDbContext(DbContextOptions<SubTrackerDbContext> options) : base(options)
    {
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.ConfigureWarnings(warnings => warnings.Ignore(RelationalEventId.QueryClientEvaluationWarning));
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Subcontractor>().ToTable("Subcontractor");        
    }
}

我的身份數據庫上下文是:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
    }
}

我認為問題是您如何設置課程的一部分。

首先,您需要ApplicationUser' in the Subcontractor`類中為ApplicationUser' in the使用外鍵:

public int CreatedUserId { get; set; }
public virtual ApplicationUser CreatedUser { get; set; }

然后(並且這是可選的),您的ApplicationUser必須具有Subcontractors的集合:

public virtual ICollection<Subcontractor> Subcontractors { get; set; }

在您的create方法上,只需指定用戶ID而不是整個用戶即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM