【问题标题】:Entity Framework 5.0, Code First, relationships, fluent API and seeding the databaseEntity Framework 5.0、Code First、关系、流式 API 和为数据库播种
【发布时间】:2013-06-14 15:00:49
【问题描述】:

我正在使用 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());
}

(其他两个答案的组合)尝试将错误发送到包管理器控制台。

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

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

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

【问题讨论】:

  • 要查看“EntityValidationErrors”,请检查:stackoverflow.com/questions/5345890/…
  • 谢谢 - 我现在已经添加了,但我看不到跟踪输出出现在哪里 - 我应该在哪里看到它;它不在调试窗口中。谢谢。
  • 您总是在创建一个新用户。你确定这是你想要的吗?
  • @lightbricko 我发现了问题; “真实”类有一个未映射到数据库的必填字段。一旦我能够看到验证错误,一切就都解决了。请张贴作为答案,以便我可以给你积分
  • @PeterSmith,我很高兴它已经解决了。我认为您应该投票赞成您在链接中发现有用的答案,(然后可以将此问题标记为重复)

标签: c# entity-framework ef-code-first fluent-interface


【解决方案1】:

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

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

走了一段路,但终于到了 - 感谢一路上的所有帮助。

【讨论】:

    猜你喜欢
    • 2012-12-20
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多