由于Core中不提供“每种类型的表”,因此我不得不做一些变通办法以使我的实体符合我的喜好。本质上,我有一个带有其属性的基类,以及它的父级的导航属性:

 public class Provision
{
    public Guid ProvisionId { get; set; }
    public string ProvisionName { get; set; }
    public string ProvisionDescription { get; set; }

    public Provision(){}
}

 public class CompanyLeaveProvision
{
    public Guid ProvisionId { get; set; }
    public int CompanyId { get; set; }
    public Provision Provision { get; set; }

    public CompanyLeaveProvision() { }
}


配置:

public void Configure(EntityTypeBuilder<Provision> builder)
    {
        // Primary Key
        builder.HasKey(t => t.ProvisionId);

        // Properties
        builder.Property(t => t.ProvisionName)
            .IsRequired()
            .HasMaxLength(40);

        builder.Property(t => t.ProvisionDescription)
            .HasMaxLength(500);

        // Table & Column Mappings
        builder.Property(t => t.ProvisionId).HasColumnName("ProvisionID");
        builder.Property(t => t.ProvisionName).HasColumnName("ProvisionName");
        builder.Property(t => t.ProvisionDescription).HasColumnName("ProvisionDescription");
        builder.ToTable("Provision", "Organization");
}

        public void Configure(EntityTypeBuilder<CompanyLeaveProvision> builder)
    {
        // Primary Key
        builder.HasKey(t => t.ProvisionId);

        // Properties
        builder.Property(t => t.ProvisionId)
            .IsRequired();

        builder.Property(t => t.CompanyId)
            .IsRequired();


        // Table & Column Mappings
        builder.ToTable("CompanyLeaveProvision", "Organization");
        builder.Property(t => t.ProvisionId).HasColumnName("ProvisionID");
        builder.Property(t => t.CompanyId).HasColumnName("CompanyID");


        builder.HasOne(t => t.Provision).WithOne().HasForeignKey<Provision>(t => t.ProvisionId);



    }


我的背景:

ProvisionContext: DbContext, IContext    {
    public DbSet<Provision> Provisions { get; set; }
    public DbSet<CompanyLeaveProvision> CompanyLeaveProvisions { get; set;}
    // OnModelCreating and other code below
 }


我在Organization.CompanyProvision表上有一个外键约束,该约束引用了ProvisionId表上的Organization.Provision属性。

发生什么情况是在基本CompanyProvision之前插入了Provision,导致此错误:


  INSERT语句与FOREIGN KEY约束冲突
  “ fk_CompanyLeaveProvision_Provision”。发生冲突
  数据库“ Dev”,表“ Organization.Provision”,列“ ProvisionID”。


为了保存,这是我正在调用的代码:

    _context.Entry(command.Provision.Provision).State = EntityState.Added;
    _context.Entry(command.Provision).State = EntityState.Added;
    await _context.SaveChangesAsync();


除了在SaveChanges()之后调用each _context.Entry(MyEntity).State = EntityState.Added之外,还有什么方法可以解决此问题?我希望一次保存这些。我知道存储过程也是一种选择,但是我不希望这样做。

谢谢您的帮助!

最佳答案

这是因为这种流利的映射

.HasForeignKey<Provision>(t => t.ProvisionId)


告诉EF Core,Provision是从属实体,并且对主体实体CompanyLeaveProvision具有FK,而数据库模型则相反。

因此,只需将Provision更改为CompanyLeaveProvision

.HasForeignKey<CompanyLeaveProvision>(t => t.ProvisionId)

10-06 12:17