同一主键 ApplicationUser table 上的 EF 多外键关系

EF multiple foreign key relationship on same primary key ApplicationUser table

我想使用代码优先的方法使用 EF 6 创建一对多关系。

举个简单经典的例子。我有两个具有一对多关系的实体 InvoiceUserApplication

我也想与相同的 ApplicationUser table 建立 UpdatedById 关系,以便能够在 UI 中显示添加记录的人的姓名谁修改了它。

 public partial class ApplicationUser : IdentityUser
    {
     public string FirstName { get; set; };
     public string  LastName { get; set; };
    }
     public virtual List<Invoice> Invoices { get; set; }
    
    
    
    public class Invoice
    {
     public int Id { get; set; }
     public string Details { get; set; }
     public string CreatedById { get; set; }
     public string UpdatedById { get; set; }
    }
     public virtual ApplicationUser CreatedBy { get; set; }
    
     builder.Entity<Invoice>()
     .HasOne(f => f.CreatedBy)
     .WithMany(mu => mu.Invoices)
     .HasForeignKey(f => f.CreatedById);

如果您想为这些关系在应用程序用户上使用导航属性,则需要创建和配置单独的导航属性。

例如

using Microsoft.EntityFrameworkCore;
using System.Linq;
using System;
using System.Collections.Generic;

namespace EfCore6Test
{

    public partial class ApplicationUser //: IdentityUser
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public virtual ICollection<Invoice> InvoicesCreated { get; } = new HashSet<Invoice>();
        public virtual ICollection<Invoice> InvoicesLastUpdated { get; } = new HashSet<Invoice>();
    }
    
    public class Invoice
    {
        public int Id { get; set; }
        public string Details { get; set; }
        public int CreatedById { get; set; }
        public int UpdatedById { get; set; }
        public virtual ApplicationUser CreatedBy { get; set; }
        public virtual ApplicationUser LastUpdatdBy { get; set; }
    }
    
    public class Db: DbContext
    {
        public DbSet<Invoice> Invoices{ get; set; }
        public DbSet<ApplicationUser> Users{ get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Invoice>()
                        .HasOne(f => f.CreatedBy)
                        .WithMany(mu => mu.InvoicesCreated)
                        .HasForeignKey(f => f.CreatedById)
                        .OnDelete(DeleteBehavior.Restrict); 

            modelBuilder.Entity<Invoice>()
                        .HasOne(f => f.LastUpdatdBy)
                        .WithMany(mu => mu.InvoicesLastUpdated)
                        .HasForeignKey(f => f.UpdatedById)
                        .OnDelete(DeleteBehavior.Restrict);

            base.OnModelCreating(modelBuilder);
        }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer("Server=localhost;database=efCore6Test;Integrated Security=true;TrustServerCertificate=true", o => o.UseRelationalNulls(true))
                .LogTo(Console.WriteLine, Microsoft.Extensions.Logging.LogLevel.Information);
            base.OnConfiguring(optionsBuilder);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            {
                
                using var db = new Db();
                db.Database.EnsureDeleted();
                db.Database.EnsureCreated();
               

            }


        }
    }
}

或者简单地省略应用程序用户的导航属性。