实体框架核心-插入单向父子关系

时间:2018-11-07 19:07:24

标签: c# entity-framework-core

由于每种类型的表在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之外,还有什么方法可以解决此问题?我希望一次保存这些。我知道存储过程也是一种选择,但是我不希望这样做。

谢谢您的帮助!

1 个答案:

答案 0 :(得分:1)

因为这种流利的映射方式

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

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

因此只需将Provision更改为CompanyLeaveProvision

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