0

Есть классы в моих тестовых приложениях:Как создать объекты Value в 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 для инициализации данных:

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

И моя сущности и значения объектов классов:

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

Когда я пытаюсь позвонить :

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

Я получаю исключение: «Одна или несколько ошибок проверки были обнаружены во время генерации модели: DomainDrivenWeb.Models.Currency: Name: Каждое имя типа в схеме должно быть уникальным. Название типа «Валюта» уже определено.»

+0

'public Currency Валюта {get; частный набор; } 'Пожалуйста, попробуйте использовать здесь другое имя переменной, например' public Currency_currency {get; частный набор; } 'или что-нибудь еще, кроме« Currency ». –

+0

Ответ указан в сообщении об ошибке. –

+0

I changed Currency Currency {get; частный набор; } в Currency AmountCurrency {get; частный набор; }, но получил то же исключение. – Oblomingo

ответ

2

Проблема здесь заключается в том, что вы лечения Currency и как ValueObject и Entity

Эта линия:..

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

Сообщает EF, что Currency тип неявно Составной тип на объекте Move, вложенном в свойство Price (тип Money). Это больше похоже на ValueObject.

Но

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

Сообщает EF рассматривать его как объект.

Именно поэтому в сообщении об ошибке указано Each type name in a schema must be unique. Type name 'Currency' is already defined.. Когда приходит время настроить модель Валюты как объекта, валюта имени типа уже определена как комплексный тип на объекте Movie.

Если вы удалите одну или другую из этих конфигурационных строк, ошибка должна исчезнуть - но это не решит вашу проблему, потому что вам нужно подумать о том, что это Currency в вашем домене действительно Entity или ValueObject ?

Movie имеет Price типа Money, который имеет свойство типа Currency - это использование подразумевает это ValueObject. Но класс имеет поле Id - наличие «идентичности» означает, что это сущность.

Вам необходимо подумать о моделировании домена и бизнес-процессах, которые воплощены в этих типах, чтобы изучить, как его действительно нужно обрабатывать.

Смежные вопросы