![](/img/trans.png)
[英]How to add a foreign key to ApplicationUser between separate project in 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.