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

时间:2015-07-08 19:14:46

标签: c# asp.net-core entity-framework-core

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

我按照here描述创建了Model,DbContext和Repository,当我尝试使用子实体插入数据时,我的app会抛出异常:

“无法将值NULL插入列'Status',表'Company';列不允许空值.INSERT失败。”

Code + Exception

我的公司实体中的Status属性不为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;
    }

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

3 个答案:

答案 0 :(得分:0)

尝试将Repository方法更改为:

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

更多信息:https://msdn.microsoft.com/en-us/data/jj592676.aspx

答案 1 :(得分:0)

模型配置不正确。这是尝试通过指向Company上的属性来为CompanyStatus配置外键。外键必须是Company上的属性。

此外,InverseReference()用于一对一的关系。看来这是尝试获得一对多,所以请改用InverseCollection()

两种解决方案

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

  1. 将CLR属性添加到包含StatusId的Company。配置行应更改为
  2. modelBuilder.Entity<Company>() .Reference(c => c.Status) .InverseCollection() .ForeignKey(cs => cs.StatusId);

    1. 如果您不想在CLR类型中使用StatusId,请配置影子状态属性。
    2. modelBuilder.Entity<Company>(b=>{ b.Property<int>("StatusId"); //this configures the shadow property b.Reference(c => c.Status).InverseCollection().ForeignKey("StatusId"); });

答案 2 :(得分:0)

在EF7中,您需要将子对象附加到上下文中。这与EF6不同,我非常确定您面临的情况。在保存之前尝试将对象附加到dbcontext。

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