由于每种类型的表在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
之外,还有什么方法可以解决此问题?我希望一次保存这些。我知道存储过程也是一种选择,但是我不希望这样做。
谢谢您的帮助!
答案 0 :(得分:1)
因为这种流利的映射方式
.HasForeignKey<Provision>(t => t.ProvisionId)
告诉EF Core Provision
是依赖的实体,并且对主体实体CompanyLeaveProvision
具有FK,而数据库模型则相反。
因此只需将Provision
更改为CompanyLeaveProvision
.HasForeignKey<CompanyLeaveProvision>(t => t.ProvisionId)