繁体   English   中英

EF7 beta5:尝试插入子实体时出错

[英]EF7 beta5: Error trying to insert child entity

我已经使用ASP.NET5和Entity Framework 7.0.0-beta 5创建了一个API。

我有型号,并且的DbContext如描述创建的存储库在这里 ,当我尝试与孩子实体数据插入我的应用程序抛出一个异常:

“无法将值NULL插入表'Company'的表'状态'中;该列不允许为空。INSERT失败。”

代码+异常

在我的公司实体中,状态属性不为null,但我不知道为什么EF无法插入子实体的值。 (在这种情况下,为“ 1”)

这是堆栈跟踪:

   at Microsoft.Data.Entity.Relational.Update.ReaderModificationCommandBatch.Execute(RelationalTransaction transaction, IRelationalTypeMapper typeMapper, DbContext context, ILogger logger)
   at Microsoft.Data.Entity.Relational.Update.BatchExecutor.Execute(IEnumerable`1 commandBatches, IRelationalConnection connection)
   at Microsoft.Data.Entity.Relational.RelationalDataStore.SaveChanges(IReadOnlyList`1 entries)
   at Microsoft.Data.Entity.ChangeTracking.Internal.StateManager.SaveChanges(IReadOnlyList`1 entriesToSave)
   at Microsoft.Data.Entity.ChangeTracking.Internal.StateManager.SaveChanges(Boolean acceptAllChangesOnSuccess)
   at Microsoft.Data.Entity.DbContext.SaveChanges(Boolean acceptAllChangesOnSuccess)
   at Microsoft.Data.Entity.DbContext.SaveChanges()
   at **.Data.Repositories.CompanyRepository.Create(Company company) in D:\**.Data\Repositories\CompanyRepository.cs:line 36
   at **.API.Controllers.CompanyController.Create(Company company) in D:\**.API\Controllers\CompanyController.cs:line 48

这是代码:

的DbContext

public class MrBellhopContext : DbContext
{

    public DbSet<Company> Company { get; set; }
    public DbSet<CompanyStatus> CompanyStatus { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Company>().Table("Company");
        modelBuilder.Entity<Company>().Key(c => c.CompanyId);
        modelBuilder.Entity<Company>().Index(c => c.Name);
        modelBuilder.Entity<Company>().Reference(c => c.Status).InverseReference().ForeignKey<CompanyStatus>(cs => cs.StatusId);

        modelBuilder.Entity<CompanyStatus>().Table("CompanyStatus");
        modelBuilder.Entity<CompanyStatus>().Key(cs => cs.StatusId);

        base.OnModelCreating(modelBuilder);
    }

}

模型

public class Company
{

    public int CompanyId { get; set; }

    public string Name { get; set; }

    public string Email { get; set; }

    public CompanyStatus Status { get; set; }

    public DateTime CreatedAt { get; set; }

    public DateTime UpdatedAt { get; set; }

}

public class CompanyStatus
{

    public int StatusId { get; set; }

    public string Name { get; set; }

}

存储库 (仅创建方法)

    public int Create(Company company)
    {
        _dbcontext.Add(company);
        _dbcontext.SaveChanges();

        return company.CompanyId;
    }

有谁知道如何正确插入子实体?

尝试将Repository方法更改为:

public int Create(Company company)
{
    using (MyDbcontextdbcontext context = new MyDbcontext()) 
    { 
        context.Entry(company).State = EntityState.Added; 
        context.SaveChanges(); 
    }
}

更多信息: https : //msdn.microsoft.com/zh-cn/data/jj592676.aspx

模型配置错误。 这试图通过指向CompanyStatus上的属性来为Company配置外键。 外键必须是Company的财产。

另外, InverseReference()用于一对一关系。 看来这是在尝试一对多,因此请改用InverseCollection()

两种解决方案

(这假设架构已正确设置为使用外键)。

  1. 向包含StatusId的Company添加CLR属性。 配置行应更改为

modelBuilder.Entity<Company>() .Reference(c => c.Status) .InverseCollection() .ForeignKey(cs => cs.StatusId);

  1. 如果您不希望StatusId为CLR类型,请配置阴影状态属性。

modelBuilder.Entity<Company>(b=>{ b.Property<int>("StatusId"); //this configures the shadow property b.Reference(c => c.Status).InverseCollection().ForeignKey("StatusId"); });

在EF7中,您需要将子对象附加到上下文中。 这与EF6不同,我很确定您所面对的场景。 保存之前,尝试将对象附加到dbcontext。

发生在我身上,请查看此问题: https//github.com/aspnet/EntityFramework/issues/2387,以获取更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM