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.
Pour voir les 'EntityValidationErrors', vérifiez ceci: http://stackoverflow.com/questions/5345890/getting-exact-error-type-in-from-dbvalidationexception – lightbricko
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. –
Vous créez toujours un nouvel utilisateur. Es-tu sûr que c'est ce que tu veux? – user1908061