2016-06-22 8 views
4

Я работаю в asp.net core Проект с использованием EF core. Я сопоставил свои объекты, переопределив функцию OnModelCreating в классе контекста. Я могу легко сопоставить эти объекты вручную. Ну, я бы лучше разместить свои коды и объяснить ..Регистрация картографирования объектов

Это то, что я сделал в моем Context классе:

protected override void OnModelCreating(ModelBuilder builder) 
    {   
     base.OnModelCreating(builder); 
     //builder.RegisterEntityMapping<CodeTable, CodeTableMap>(); 
     builder.RegisterEntityMapping<Country, CountryMap>(); 
     builder.RegisterEntityMapping<State, StateMap>(); 
     builder.RegisterEntityMapping<City, CityMap>(); 
     builder.RegisterEntityMapping<User, UserMap>(); 
     builder.RegisterEntityMapping<Prospect, ProspectMap>(); 
    } 

Country.cs

public class Country:BaseEntity 
{ 

    public string CountryCode { get; set; } 
    public string CountryName { get; set; } 
    public string Currency { get; set; } 
    public string CurrencyName { get; set; } 
    public string UnitOfMeasure { get; set; } 
    public string TelephoneCountryCode { get; set; } 
    public string CurrencySymbol { get; set; } 

    public virtual ICollection<State> States { get; set; } 
    public virtual ICollection<City> Cities { get; set; } 
} 

CountryMap.cs

public class CountryMap : QuantumEntityTypeConfiguration<Core.Domain.Country> 
{ 
    public override void Map(EntityTypeBuilder<Core.Domain.Country> builder) 
    { 
     builder.ToTable("Country"); 
     builder.HasKey(pr => pr.CountryCode); 

     builder.HasMany(m => m.Cities).WithOne(i=> i.Country).HasForeignKey(m=> m.CountryCode); 
     builder.HasMany(m => m.States).WithOne(i => i.Country).HasForeignKey(m => m.CountryCode); 
    } 
} 

Но я хотел бы сделать это динамически, так как позже было бы набросано отобразить все модели. Я мог бы найти решение в контексте класса nopCommerce, где они делали таким образом:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     //dynamically load all configuration 
     //System.Type configType = typeof(LanguageMap); //any of your configuration classes here 
     //var typesToRegister = Assembly.GetAssembly(configType).GetTypes() 

     var typesToRegister = Assembly.GetExecutingAssembly().GetTypes() 
     .Where(type => !String.IsNullOrEmpty(type.Namespace)) 
     .Where(type => type.BaseType != null && type.BaseType.IsGenericType && 
      type.BaseType.GetGenericTypeDefinition() == typeof(NopEntityTypeConfiguration<>)); 
     foreach (var type in typesToRegister) 
     { 
      dynamic configurationInstance = Activator.CreateInstance(type); 
      modelBuilder.Configurations.Add(configurationInstance); 
     } 
     //...or do it manually below. For example, 
     //modelBuilder.Configurations.Add(new LanguageMap()); 



     base.OnModelCreating(modelBuilder); 
    } 

Я попытался осуществить это, и я получил сообщение об ошибке:

protected override void OnModelCreating(ModelBuilder builder) 
    { 
     // TODO: Use Dynamic mapping by getting classes which uses QuantumEntityTypeConfiguration 
     var typesToRegister = Assembly.GetExecutingAssembly().GetTypes() 
     .Where(type => !String.IsNullOrEmpty(type.Namespace)) 
     .Where(type => type.BaseType != null && type.BaseType.IsGenericType && 
      type.BaseType.GetGenericTypeDefinition() == typeof(QuantumEntityTypeConfiguration<>)); 
     foreach (var type in typesToRegister) 
     { 
      dynamic configurationInstance = Activator.CreateInstance(type);     
      builder.Configurations.Add(configurationInstance); //Error in this line specifying:ModelBuilder has no defination for Configuration. 
     }} 

Ошибка enter image description here

Ну nopCommerce использует DbModelBuilder из пространства имен: System.Data.Entity и я использую ModelBuilder в пространстве имен: Microsoft.EntityFrameworkCore.

Итак, если у вас есть какие-либо решения или рекомендации. пожалуйста, дай мне знать.

+0

Полезного GitHub вопрос: HTTPS : //github.com/aspnet/EntityFramework/issues/2805 см. последнюю запись, а также https://github.com/Grinderofl/FluentModelBuilder –

ответ

4

В EF Core нет Configurations Недвижимость доступна на ModeBuilderas of now.

Один из способов обойти эту проблему, чтобы изменить конфигурацию в

public class CountryMap : QuantumEntityTypeConfiguration<Country> 
{ 
    public CountryMap(ModelBuilder modelBuilder) 
    { 
     EntityTypeBuilder<Country> builder = modelBuilder.Entity<Country>() 

     builder.ToTable("Country"); 
     builder.HasKey(pr => pr.CountryCode); 

     builder.HasMany(m => m.Cities).WithOne(i=> i.Country).HasForeignKey(m=> m.CountryCode); 
     builder.HasMany(m => m.States).WithOne(i => i.Country).HasForeignKey(m => m.CountryCode); 
    } 
} 

И тогда вы можете добавить их в DbContext по OnModelCreating методы, как это:

foreach (var type in typesToRegister) 
{  
    Activator.CreateInstance(type, modelBuilder); 
} 
+1

Это сработало отлично ... :) –