2013-06-18 1 views
0

J'utilise Visual Studio 2010, C# 4.0 et Entity Framework 5.0.Entity Framework 5.0, Code First, relations, API fluide et amorçage de la base de données

Mes modèles (simplifié) sont les suivants:

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

Le contexte de données est:

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

Et j'ensemencement de la base de données avec:

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

Utilisation des migrations sans graines la base de données se déploie sans erreur et je peux remplir la base de données manuellement.

Si je commente le User classe les graines de base de données correctement.

LE PROBLÈME

Dès que j'ajoute la user relation et exécutez la commande de migration je reçois cette erreur

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

Je ne vois pas les EntityValidationErrors et les points de rupture et non atteint.

Le problème semble être dans la relation. J'ai essayé différentes manières de le spécifier mais le résultat est toujours le même.

LA RÉPONSE

Getting exact error type in from DbValidationException a été la première partie de la solution - comprendre l'erreur. J'ai alors besoin d'ajouter

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

(un amalgm de deux autres réponses) avec un essai pour obtenir le errorto la console Package Manager.

Enfin, je trouve que mon modèle « réel » contenait les éléments suivants:

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

Je pensais que le NotMapped exclurait le terrain, mais l'Required semble passer outre cela. Une fois que j'ai mis une valeur pour cela, tout a commencé à fonctionner.

+0

Pour voir les 'EntityValidationErrors', vérifiez ceci: http://stackoverflow.com/questions/5345890/getting-exact-error-type-in-from-dbvalidationexception – lightbricko

+0

Merci - J'ai maintenant ajouté cela mais je ne peut pas voir où la sortie de trace apparaît - où devrais-je voir cela; ce n'est pas dans la fenêtre de débogage. Merci. –

+0

Vous créez toujours un nouvel utilisateur. Es-tu sûr que c'est ce que tu veux? – user1908061

Répondre

0

S'il vous plaît voir les commentaires sur la question ci-dessus. Il y avait une série d'étapes nécessaires pour résoudre ce problème.

  1. Affichage des erreurs de validation - la solution mentionnée ci-dessus par lightbricko a permis aux erreurs à récupérer, mais ils ne pas afficher dans la console PM
  2. Ceci a été réalisé en ajoutant le stringbuilder au code affiché ci-dessus puis lancer que comme une nouvelle exception
  3. Enfin qui a montré qu'un champ qui n'a pas été mis en correspondance avec la base de données a été encore validé dans le cadre du processus de semences

un peu d'un voyage, mais il a enfin - merci pour tous les aide sur le chemin.

Questions connexes