エンティティマッピングの登録

asp.net-core data-mapping entity-framework-core

質問

私はasp.netコアプロジェクトでEFコアを使用しています。コンテキストクラスの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.
        }}

エラー ここに画像の説明を入力

よくnopCommerceは、名前空間のDbModelBuilderSystem.Data.Entityを使用し、 ModelBuilderは名前空間: Microsoft.EntityFrameworkCoreで使用します

だから、あなたは何か解決策や勧告があれば。私にお知らせください。

受け入れられた回答

EFコアでは、現在 ModeBuilder利用可能なConfigurationsプロパティはありません。

この問題を回避する1つの方法は、構成を次のように変更することです。

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


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ