[英]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();
}
}
模型配置错误。 这试图通过指向CompanyStatus
上的属性来为Company
配置外键。 外键必须是Company
的财产。
另外, InverseReference()
用于一对一关系。 看来这是在尝试一对多,因此请改用InverseCollection()
。
(这假设架构已正确设置为使用外键)。
Company
添加CLR属性。 配置行应更改为 modelBuilder.Entity<Company>() .Reference(c => c.Status) .InverseCollection() .ForeignKey(cs => cs.StatusId);
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.