实体框架5.0,代码优先,关系,流畅的API和种子数据库

时间:2013-06-18 11:53:15

标签: 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; 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);
    }
}

我正在用以下方式播种数据库:

protected override void Seed(DataContext context)
    {
        Case Case = new Case();
        Case.CaseStatusID = 1;
        Case.DateOfNotification = DateTime.Today;

        Case.User = new User();

        Case.User.UserID = Case.CaseID;
        Case.User.UsersFamilyNameEnc = "Smith";
        Case.User.UsersGivenNameEnc = "Petra";

        context.Cases.AddOrUpdate(Case);         
        context.SaveChanges();
    }

使用没有种子的迁移,数据库部署时没有错误,我可以手动填充数据库。

如果我注释掉User类,数据库正确播种。

问题

只要我添加user关系并运行迁移命令,我就会收到此错误

Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.

我看不到EntityValidationErrors和任何断点但未达到。

问题似乎在于这种关系。我已经尝试了不同的方法来指定它,但结果总是一样的。

答案

Getting exact error type in from DbValidationException 是解决方案的第一部分 - 理解错误。然后我需要添加

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());
}

(另外两个答案的合并)试图让errorto成为Package Manager控制台。

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

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

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

1 个答案:

答案 0 :(得分:0)

请参阅上述问题的评论。解决这个问题需要一系列步骤。

  1. 显示验证错误 - lightbricko上面提到的解决方案启用了要检索的错误但它们没有显示在PM控制台中
  2. 这是通过将stringbuilder添加到上面显示的代码然后将其作为新异常
  3. 来实现的
  4. 最后,这表明未映射到数据库的字段仍然作为种子过程的一部分进行了验证
  5. 有点旅程但终于到了那里 - 感谢路上的所有帮助。