【问题标题】:Entity Framework Core - Inserting One-Directional Parent Child RelationshipEntity Framework Core - 插入单向父子关系
【发布时间】:2018-11-08 03:55:43
【问题描述】:

由于每个类型的表在 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 表上有一个外键约束,它引用了 Organization.Provision 表上的 ProvisionId 属性。

发生的情况是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();

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

感谢您的帮助!

【问题讨论】:

    标签: c# entity-framework-core


    【解决方案1】:

    因为这个流畅的映射

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

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

    所以只需将Provision 更改为CompanyLeaveProvision

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

    【讨论】:

      猜你喜欢
      • 2018-06-24
      • 2022-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-10
      • 1970-01-01
      • 2017-02-17
      相关资源
      最近更新 更多