C# 实体框架5.0、代码优先、关系、fluent API和数据库种子

C# 实体框架5.0、代码优先、关系、fluent API和数据库种子,c#,entity-framework,ef-code-first,fluent-interface,C#,Entity Framework,Ef Code First,Fluent Interface,我使用的是Visual Studio 2010、C#4.0和Entity Framework 5.0 我的(简化)模型是: public class Case { public int CaseID { get; set; } public int CaseStatusID { get; set; } public DateTime DateOfNotification { get; set; } public User User { get;

我使用的是Visual Studio 2010、C#4.0和Entity Framework 5.0

我的(简化)模型是:

public class Case
{
    public int CaseID { get; set; }
    public int CaseStatusID { get; set; }
    public DateTime DateOfNotification { get; set; }        

    public User User { get; set; }

    public Case()
    {                  
    }
}

public class User
{
    public int UserID {get;set;}
    public string Name { get; set; }

    public Case Case { get; set; }

    public User()
    {
    }
}
数据上下文是:

public class DataContext : DbContext
{
    public DbSet<Case> Cases { get; set; }
    public DbSet<User> Users { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Case>()
           .HasKey(m => m.CaseID)
           .Property(m => m.CaseID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        modelBuilder.Entity<Case>()
            .HasRequired(m => m.User)
            .WithRequiredPrincipal(m => m.Case);
    }
}
使用无种子迁移,数据库部署时不会出现错误,我可以手动填充数据库

如果我注释掉
用户
类,则数据库种子会正确

问题

一旦我添加了
user
关系并运行migration命令,我就会得到这个错误

Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.
我看不到EntityValidationErrors和任何未达到的断点

问题似乎出在这段关系上。我尝试了不同的方法来说明这一点,但结果总是一样的

答案

这是解决方案的第一部分——理解错误。然后我需要补充一点

catch (DbEntityValidationException dbEx)
{
    StringBuilder sb = new StringBuilder();

    foreach (var validationErrors in dbEx.EntityValidationErrors)
    {
        foreach (var validationError in validationErrors.ValidationErrors)
        {
            Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
            sb.AppendFormat("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
        }
    }
    throw new Exception(sb.ToString());
}
(另外两个答案的集合)尝试将错误发送到PackageManager控制台

最后,我发现我的“真实”模型包含以下内容:

[NotMapped]
[Required(ErrorMessage = "The family name/surname is required")]
[Display(Name = "Family name/surname")]
public string UserName { get; set; }

我以为
NotMapped
会排除该字段,但
Required
似乎会覆盖该字段。一旦我为它输入了一个值,它就开始工作了。

请查看上面问题的注释。需要采取一系列步骤来解决这个问题

  • 显示验证错误-lightbricko上面提到的解决方案允许检索错误,但它们没有显示在PM控制台中
  • 这是通过将stringbuilder添加到上面显示的代码中,然后将其作为新异常抛出来实现的
  • 最后,这表明未映射到数据库的字段仍然作为种子过程的一部分进行验证

  • 虽然经历了一段旅程,但最终到达了目的地-感谢路上的所有帮助。

    要查看“EntityValidationErrors”,请检查以下内容:谢谢-我现在已在中添加了,但我看不到跟踪输出显示在哪里-我应该在哪里看到它;它不在调试窗口中。谢谢。你总是在创建一个新用户。你确定这就是你想要的吗?@lightbricko我发现了问题;“real”类有一个未映射到数据库的必填字段。当我能够看到验证错误时,所有问题都解决了。请张贴作为答案,这样我可以给你答案points@PeterSmith,我很高兴问题解决了。我认为你应该把你在链接中找到的有用答案投上一票,(然后这个问题可以标记为重复)
    [NotMapped]
    [Required(ErrorMessage = "The family name/surname is required")]
    [Display(Name = "Family name/surname")]
    public string UserName { get; set; }