0

Il y a des classes dans mes applications de test:Comment créer des objets de valeur dans le projet ASP.Net MVC, Entity Framework 6?

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
    public ApplicationDbContext() 
     : base("DefaultConnection", throwIfV1Schema: false) 
    { 
     Database.SetInitializer<ApplicationDbContext>(new MovieContextInitializer()); 
    } 

    public DbSet<Movie> Movies { get; set; } 
    public DbSet<Currency> Currencies { get; set; } 

    public static ApplicationDbContext Create() 
    { 
     return new ApplicationDbContext(); 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Types<Movie>() 
     .Configure(ctc => ctc.Property(m => m.Price.Amount).HasColumnName("MoviePriceAmount")); 

     modelBuilder.Types<Movie>() 
     .Configure(ctc => ctc.Property(m => m.Price.Currency.Id).HasColumnName("MoviePriceCurrency")); 

     base.OnModelCreating(modelBuilder); 
    } 
} 

MovieContextInitializer pour les données INIT:

public class MovieContextInitializer : DropCreateDatabaseIfModelChanges<ApplicationDbContext> 
{ 
    protected override void Seed(ApplicationDbContext context) 
    { 
     var usdCurrency = new Currency {Id = 1, Name = "USD"}; 
     var euroCurrency = new Currency {Id = 2, Name = "EUR"}; 

     context.Currencies.Add(usdCurrency); 
     context.Currencies.Add(euroCurrency); 

     context.Movies.Add(new Movie 
     { 
      Title = "GhoustBusters", 
      Genre = "Comedy", 
      ReleaseDate = new DateTime(2016, 9, 10), 
      Price = new Money(50, usdCurrency) 
     }); 

     context.Movies.Add(new Movie 
     { 
      Title = "Matrix", 
      Genre = "Action", 
      ReleaseDate = new DateTime(2010, 2, 10), 
      Price = new Money(40, euroCurrency) 
     }); 
    } 
} 

et les objets de mon entité et la valeur des classes:

public class Movie 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public DateTime ReleaseDate { get; set; } 
    public string Genre { get; set; } 
    public Money Price { get; set; } 
} 
public class Currency 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 
[ComplexType] 
public class Money 
{ 
    public Money(int amount, Currency currency) 
    { 
     Amount = amount; 
     Currency = currency; 
    } 
    public int Amount { get; private set; } 
    public Currency Currency { get; private set; } 
} 

Quand je suis en train d'appeler :

ApplicationDbContext db = new ApplicationDbContext(); 
var movies = db.Movies.ToList() 

Je reçois une exception: "Une ou plusieurs erreurs de validation ont été détectées lors de la génération du modèle: DomainDrivenWeb.Models.Currency: Name: Chaque nom de type dans un schéma doit être unique. Le nom du type "Devise" est déjà défini. »

+0

'public Devise Devise {obtenir; ensemble privé; } 'Essayez d'utiliser ici un nom de variable différent, par exemple' public Currency _currency {get; ensemble privé; } 'ou autre chose sauf' Currency'. –

+0

La réponse est dans le message d'erreur. –

+0

J'ai changé Devise Devise {get; ensemble privé; } à Currency AmountCurrency {get; ensemble privé; }, mais a la même exception. – Oblomingo

Répondre

2

Le problème ici est que vous traitez Currency à la fois comme un ValueObject et une entité

Cette ligne:..

modelBuilder.Types<Movie>() 
    .Configure(ctc => ctc.Property(m => m.Price.Currency.Id).HasColumnName("MoviePriceCurrency")); 

EF Indique que le type Currency est implicitement un type complexe sur l'entité Move -. niché sur la propriété Prix (de type Money) Ceci est plus comme un ValueObject

Mais

.
public DbSet<Currency> Currencies { get; set; } 

Signale EF pour le traiter comme une entité. C'est pourquoi le message d'erreur indique Each type name in a schema must be unique. Type name 'Currency' is already defined. - Lorsque vient le temps de configurer le modèle de devise en tant qu'entité, la devise de nom de type est déjà définie en tant que type complexe sur l'entité Movie. Si vous supprimez l'une ou l'autre de ces lignes de configuration, l'erreur devrait disparaître - mais cela ne résoudra pas vraiment votre problème, parce que vous devez y penser - Currency dans votre domaine est vraiment une Entité ou un ValueObject ?

Movie a une Price de type Money qui a une propriété de type Currency - cet usage implique qu'il est un ValueObject. Mais la classe a un champ Id - la présence de 'l'identité' implique que c'est une entité.

Vous devez réfléchir à la modélisation du domaine et aux processus métier qui sont incorporés dans ces types pour explorer comment il devrait être réellement traité.