2017-02-25 176 views
0

我试图建立与实体框架核心的Web应用程序,我创建了两个模型Category一个Pie,我做的所有事情,包括的DbContext的依赖注入,我创建了一个DbInializer类检查如果数据库是空的,如果这是真的,它会插入一些数据,问题是当我运行应用程序时,我得到一个异常,就好像Categories表中的主键和Pies表中的外键之间存在冲突,这是例外:冲突的PK实体框架核心

System.Data.SqlClient.SqlException: The MERGE statement conflicted with the FOREIGN KEY constraint "FK_Pies_Categories_CategoryId".The conflict occurred in database "ShopDb", table "dbo.Categories", column 'CategoryId'. 
    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) 
    at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean & dataReady) 
    at System.Data.SqlClient.SqlDataReader.TryHasMoreRows(Boolean & moreRows) 
    at System.Data.SqlClient.SqlDataReader.TryHasMoreResults(Boolean & moreResults) 
    at System.Data.SqlClient.SqlDataReader.TryNextResult(Boolean & more) 
    at System.Data.SqlClient.SqlDataReader.NextResult() 
    at Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.Consume(DbDataReader reader) 
ClientConnectionId: 775a7294 - 531a - 44cc - 8fbc - 29d293c339d5 
     Error Number: 547,State: 0,Class: 16} 

这是馅饼类:

public class Pie 
{ 
     public int PieId { get; set; } 
     public string Name { get; set; } 
     public string ShortDescrition { get; set; } 
     public string LongDescription { get; set; } 
     public string AllegryInformation { get; set; } 
     public string ImageUrl { get; set; } 
     public string ImageThumbnailUrl { get; set; } 
     public bool IsPieOfTheWeek { get; set; } 
     public bool InStock { get; set; } 
     public decimal Price { get; set; } 
     public int CategoryId { get; set; } 
     public virtual Category Category { get; set; } 
} 

...这里是Category类:

public class Category 
{ 
     public int CategoryId { get; set; } 
     public string CategoryName { get; set; } 
     public string Description { get; set; } 
     public List<Pie> Pies { get; set; } 
} 

个启动类的配置方法:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
     { 
      app.UseDeveloperExceptionPage(); 
      app.UseStatusCodePages(); 
      app.UseStaticFiles(); 
      app.UseMvcWithDefaultRoute(); 
      DbInitializer.Seed(app); 
     } 

DbInitializer类:

public class DbInitializer 
{ 

     public static void Seed(IApplicationBuilder applicationBuilder) 
     { 
      AppDbContext context = applicationBuilder.ApplicationServices.GetRequiredService<AppDbContext>(); 
      if (!context.Categories.Any()) 
      { 
       context.AddRange(
         new Category { CategoryName = "First Pie", Description="Descriptionslqdfq vdfhsqdqsdhfs qsdhf" }, 
         new Category { CategoryName = "Cheese Cackes", Description = "Descriptionslqdfq vdfhsqdqsdhfs qsdhf" }, 
         new Category { CategoryName = "Saesonal Pie", Description = "Descriptionslqdfq vdfhsqdqsdhfs qsdhf" }); 
      } 
      if (!context.Pies.Any()) 
      { 
       context.AddRange(new Pie { Name = "Apple Pie", ShortDescrition = "short description", LongDescription = "Long description", AllegryInformation = "sflqjq", ImageUrl = "#", IsPieOfTheWeek = true, InStock = true, Price = 15.65M }, 
        new Pie { Name = "Apple Pie", ShortDescrition = "short description", LongDescription = "Long description", AllegryInformation = "sflqjq", ImageUrl = "#", IsPieOfTheWeek = true, InStock = true, Price = 15.65M }, 
        new Pie { Name = "Apple Pie", ShortDescrition = "short description", LongDescription = "Long description", AllegryInformation = "sflqjq", ImageUrl = "#", IsPieOfTheWeek = true, InStock = true, Price = 15.65M }, 
        new Pie { Name = "Apple Pie", ShortDescrition = "short description", LongDescription = "Long description", AllegryInformation = "sflqjq", ImageUrl = "#", IsPieOfTheWeek = true, InStock = true, Price = 15.65M }, 
        new Pie { Name = "Apple Pie", ShortDescrition = "short description", LongDescription = "Long description", AllegryInformation = "sflqjq", ImageUrl = "#", IsPieOfTheWeek = true, InStock = true, Price = 15.65M }); 
      } 
      context.SaveChanges(); 
     } 


} 
+0

插入时是否出现此错误? – Usman

+0

您可以通过哪种方式配置您的实体之间的关系? – brut

+0

@Usman当我调用DbInitializer类的Seed方法时发生异常 –

回答

3

这是因为你添加

public int CategoryId { get; set; } 

pie实体框架的是独自处理的关系,当你在你的情况下添加

public virtual Category Category { get; set; } 

当您添加CategoryId,预计categoryId,因为它不是设置为这就是空为什么它给人的异常,所以你可以设置CategoryIdnullable int

public int? CategoryId { get; set; } 

,或者你可以让实体框架处理它作为一个nullable