EF কোর ম্যাপিং সত্ত্বা টাইপ কনফিগারেশন


129

EF6 এ আমরা সাধারণত সত্তাটি কনফিগার করতে এই উপায়ে ব্যবহার করতে সক্ষম হয়েছি।

public class AccountMap : EntityTypeConfiguration<Account>
{
    public AccountMap()
    {
        ToTable("Account");
        HasKey(a => a.Id);

        Property(a => a.Username).HasMaxLength(50);
        Property(a => a.Email).HasMaxLength(255);
        Property(a => a.Name).HasMaxLength(255);
    }
}

আমরা কীভাবে EF কোর এ করতে পারি, যেহেতু প্রথম শ্রেণিটি উত্তরাধিকারের সত্তা টাইপ কনফিগারেশন যা ক্লাসটি সন্ধান করতে অক্ষম।

আমি গিটহাব থেকে ইএফ কোর কাঁচা উত্স কোডটি ডাউনলোড করেছি, আমি এটি খুঁজে পাচ্ছি না। কেউ এই সাহায্য করতে পারেন?


8
কেন যে উত্তর গ্রহণ না?
ডেন

যেহেতু এটি এখন বিটা 5-তে রয়েছে, যখন আমরা সর্বোচ্চ দৈর্ঘ্য (50) রাখি। ডিবিতে এটি এনভারচর (সর্বাধিক) উত্পন্ন করে
হারমান

6
জন্য অন্য কেউ এই আগ্রহী, সেখানে এখন একটি হল IEntityTypeConfiguration<T>এক সঙ্গে void Configure()পদ্ধতি আপনি বাস্তবায়ন করতে পারে। বিশদটি
গ্যালিলি

উত্তর:


183

EF কোর 2.0 যেহেতু আছে IEntityTypeConfiguration<TEntity>। আপনি এটি এর মতো ব্যবহার করতে পারেন:

class CustomerConfiguration : IEntityTypeConfiguration<Customer>
{
  public void Configure(EntityTypeBuilder<Customer> builder)
  {
     builder.HasKey(c => c.AlternateKey);
     builder.Property(c => c.Name).HasMaxLength(200);
   }
}

...
// OnModelCreating
builder.ApplyConfiguration(new CustomerConfiguration());

এটিতে এবং 2.0 তে প্রবর্তিত অন্যান্য নতুন বৈশিষ্ট্যগুলির বিষয়ে আরও এখানে পাওয়া যাবে


8
এটি EF কোর 2.0 এর সেরা উত্তর। ধন্যবাদ!
কলিন এম। ব্যারেট

2
এটি দুর্দান্ত। আমি সাবলীল এপিআই সংজ্ঞা পৃথক করার একটি উপায় খুঁজছিলাম। ধন্যবাদ
ব্লেজ

এছাড়াও "ToTable" এবং "HasColumnName", ইত্যাদি ::: এই উত্তর দেখার stackoverflow.com/questions/43200184/...
granadaCoder

আপনার যদি ম্যান কাস্টম কনফিগারেশন থাকে তবে কেবল কাস্টম কনফিগারেশনগুলি builder.ApplyConfigurationsFromAssembly(typeof(ApplicationDbContext).Assembly);প্রয়োগ করুন
alim91

52

আপনি কিছু সাধারণ অতিরিক্ত ধরণের মাধ্যমে এটি অর্জন করতে পারেন:

internal static class ModelBuilderExtensions
{
   public static void AddConfiguration<TEntity>(
     this ModelBuilder modelBuilder, 
     DbEntityConfiguration<TEntity> entityConfiguration) where TEntity : class
   {     
       modelBuilder.Entity<TEntity>(entityConfiguration.Configure);
   }
}

internal abstract class DbEntityConfiguration<TEntity> where TEntity : class
{     
    public abstract void Configure(EntityTypeBuilder<TEntity> entity);
}

ব্যবহার:

internal class UserConfiguration : DbEntityConfiguration<UserDto>
{
    public override void Configure(EntityTypeBuilder<UserDto> entity)
    {
        entity.ToTable("User");
        entity.HasKey(c => c.Id);
        entity.Property(c => c.Username).HasMaxLength(255).IsRequired();
        // etc.
    }
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.AddConfiguration(new UserConfiguration());
}

1
কোথায় আছে ForSqlServerToTable()?
im1dermike

1
এটি এখন ToTable, ডকস.মাইক্রোসফট
en-

1
এটির সাথে কীভাবে ব্যবহার করতে হয় কলমটাইপ ? । যেমন যেমন entity.Property(c => c.JoinDate).HasColumnType("date");
বিজু সোমান

OnModelCreatingএকটি প্রয়োজন আপডেট করা হয়েছে DbModelBuilder। এতে কনফিগারেশন যুক্ত করার modelBuilder.Configurations.Add(new UserConfiguration());
উপায়টি

2
@ আইজি - ডিবিমোডেলবিল্ডার হলেন সত্তা ফ্রেমওয়ার্ক 6.0, মডেলবিল্ডার হলেন ইএফ কোর। তারা বিভিন্ন সমাবেশ এবং এই ক্ষেত্রে প্রশ্নটি EF কোরের সাথে সুনির্দিষ্ট ছিল।
জেসন

29

EF7 এ, আপনি প্রয়োগ করছেন এমন DbContext শ্রেণিতে অনমোডেল ক্রিয়েটিংকে ওভাররাইড করবেন।

protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<Account>()
            .ForRelational(builder => builder.Table("Account"))
            .Property(value => value.Username).MaxLength(50)
            .Property(value => value.Email).MaxLength(255)
            .Property(value => value.Name).MaxLength(255);
    }

23
সুতরাং যদি আমার 20 টি সত্তার ধরণের কনফিগারেশন থাকে তবে আমি সেগুলি একটি বিশাল পদ্ধতিতে রেখেছি?
ডেন

6
ডিফল্টরূপে, এটি তাই বলে মনে হচ্ছে। আপনি আপনার নিজের FooMapper / FooModelBuilder ক্লাস তৈরি করতে পারেন যা বেস ক্লাসটি প্রসারিত করে এবং এমন একটি পদ্ধতি রয়েছে যা আপনি টাইপ করা সত্তা বিল্ডার <ফু> পাস করেন। আপনি অভিনব হতে চাইলে আপনি স্বয়ংক্রিয়ভাবে আপনার জন্য অনুসন্ধান / ডেকে আনার জন্য নতুন নির্ভরতা ইনজেকশন এবং আইকনফিগারেশন ইন্টারফেসও ব্যবহার করতে পারেন!
আভি চেরি

1
আপনাকে স্বাগতম. একটি উত্তর আপ-ভোট দেওয়া (এবং প্রশ্নকারীকে এটি গ্রহণ করার জন্য উত্সাহ দেওয়া) আরও ভাল!
আভি চেরি

আমি সাধারণত এটি করি :)
ডেন

4
নতুন নির্ভরতা ইনজেকশন সরঞ্জাম ব্যবহার করে দেখুন? IEntityMapperStrategyএকটি void MapEntity(ModelBuilder, Type)স্বাক্ষর সহ এবং একটি ইন্টারফেস তৈরি করুন bool IsFor(Type)। আপনি যতবার চান ইন্টারফেসটি যতবার বা কয়েকবার প্রয়োগ করুন (যাতে আপনি চান এমন শ্রেণি তৈরি করতে পারেন যা আপনি চাইলে একাধিক সত্তাকে মানচিত্র করতে পারেন) এবং তারপরে একটি অন্য শ্রেণি (কৌশল সরবরাহকারী) তৈরি করুন যা সমস্তকে সংক্রামিত IEnumerableকরে IEntityMapperStrategies। 'বিশেষ প্রকার' এর অধীনে এখানে দেখুন । এটি আপনার প্রসঙ্গে ইনজেক্ট করুন।
আভি চেরি

22

এটি বর্তমান সর্বশেষ, বিটা 8 ব্যবহার করছে এটি চেষ্টা করুন:

public class AccountMap
{
    public AccountMap(EntityTypeBuilder<Account> entityBuilder)
    {
        entityBuilder.HasKey(x => x.AccountId);

        entityBuilder.Property(x => x.AccountId).IsRequired();
        entityBuilder.Property(x => x.Username).IsRequired().HasMaxLength(50);
    }
}

তারপরে আপনার ডিবি কনটেক্সটে:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        new AccountMap(modelBuilder.Entity<Account>());
    }

3
আমি এই একই কাজ শেষ। আমি যদিও কনস্ট্রাক্টরের পরিবর্তে স্থির পদ্ধতি ব্যবহার করার সিদ্ধান্ত নিয়েছি।
ম্যাট স্যান্ডার্স

আমি এই পদ্ধতিটি ব্যবহার করছি এবং এ পর্যন্ত আমার উত্তরাধিকার ছাড়া কোনও সমস্যা হয়নি। যদি আমি আপনার উদাহরণের অ্যাকাউন্টম্যাপটি কোনও নতুনটিতে রূপান্তর করতে এবং একটি বিকল্প কী যুক্ত করতে চাই - তবে সর্বোত্তম পন্থাটি কী হবে?
ক্রিস

14

আপনি প্রতিটি সত্তার জন্য পৃথক ম্যাপিং ক্লাসের সাথে EF6 এ কীভাবে কাজ করেন তার সাথে একইভাবে জিনিসগুলি করতে আপনি প্রতিবিম্ব ব্যবহার করতে পারেন। এটি আরসি 1 ফাইনালে কাজ করে:

প্রথমে আপনার ম্যাপিংয়ের ধরণের জন্য একটি ইন্টারফেস তৈরি করুন:

public interface IEntityTypeConfiguration<TEntityType> where TEntityType : class
{
    void Map(EntityTypeBuilder<TEntityType> builder);
}

তারপরে আপনার প্রতিটি সত্তার জন্য ম্যাপিং ক্লাস তৈরি করুন, যেমন কোনও Personশ্রেণীর জন্য:

public class PersonMap : IEntityTypeConfiguration<Person>
{
    public void Map(EntityTypeBuilder<Person> builder)
    {
        builder.HasKey(x => x.Id);
        builder.Property(x => x.Name).IsRequired().HasMaxLength(100);
    }
}

এখন, OnModelCreatingআপনার DbContextপ্রয়োগের মধ্যে প্রতিবিম্ব যাদু :

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    // Interface that all of our Entity maps implement
    var mappingInterface = typeof(IEntityTypeConfiguration<>);

    // Types that do entity mapping
    var mappingTypes = typeof(DataContext).GetTypeInfo().Assembly.GetTypes()
        .Where(x => x.GetInterfaces().Any(y => y.GetTypeInfo().IsGenericType && y.GetGenericTypeDefinition() == mappingInterface));

    // Get the generic Entity method of the ModelBuilder type
    var entityMethod = typeof(ModelBuilder).GetMethods()
        .Single(x => x.Name == "Entity" && 
                x.IsGenericMethod && 
                x.ReturnType.Name == "EntityTypeBuilder`1");

    foreach (var mappingType in mappingTypes)
    {
        // Get the type of entity to be mapped
        var genericTypeArg = mappingType.GetInterfaces().Single().GenericTypeArguments.Single();

        // Get the method builder.Entity<TEntity>
        var genericEntityMethod = entityMethod.MakeGenericMethod(genericTypeArg);

        // Invoke builder.Entity<TEntity> to get a builder for the entity to be mapped
        var entityBuilder = genericEntityMethod.Invoke(builder, null);

        // Create the mapping type and do the mapping
        var mapper = Activator.CreateInstance(mappingType);
        mapper.GetType().GetMethod("Map").Invoke(mapper, new[] { entityBuilder });
    }
}

কোন রেফারেন্সটি DataContextএবং .Whereব্যবহার করে? আমি এর জন্য একটি পৃথক প্রকল্প করেছি এবং রেফারেন্সটি খুঁজে পাবে না বলে মনে হচ্ছে।
রুচান

.Whereহয় System.Linq, DataContextহয় বর্গ যেখানে কোড যোগ করা হয় (আমার মতিন DbContextimpl)
Cocowalla

12

EF কোর 2.2 যেহেতু আপনি ক্লাবের অনমোডেলক্রিয়াটিং পদ্ধতিতে একটি লাইনে সমস্ত কনফিগার (ক্লাস, যা আইএনটিটিটাইপস কনফিগারেশন ইন্টারফেস প্রয়োগ করেছে) যুক্ত করতে পারেন যা ডিবি কনটেক্সট ক্লাস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    //this will apply configs from separate classes which implemented IEntityTypeConfiguration<T>
    modelBuilder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly());
}

পূর্ববর্তী উত্তরে যেমন উল্লেখ করা হয়েছিল, যেহেতু ইএফ কোর ২.০, আপনি কনফিগার পদ্ধতিতে ফ্লুয়েন্টিপি ব্যবহার করে ইন্টারফেস আইএনটিটিটাইপস কনফিগারেশন, সেটআপ ম্যাপিং কনফিগারেশন প্রয়োগ করতে পারেন।

public class QuestionAnswerConfig : IEntityTypeConfiguration<QuestionAnswer>
{
    public void Configure(EntityTypeBuilder<QuestionAnswer> builder)
    {
      builder
        .HasKey(bc => new { bc.QuestionId, bc.AnswerId });
      builder
        .HasOne(bc => bc.Question)
        .WithMany(b => b.QuestionAnswers)
        .HasForeignKey(bc => bc.QuestionId);
      builder
        .HasOne(bc => bc.Answer)
        .WithMany(c => c.QuestionAnswers)
        .HasForeignKey(bc => bc.AnswerId);
    }
}

6

আমি বর্তমানে একটি প্রকল্পে কাজ করছি এটিই।

public interface IEntityMappingConfiguration<T> where T : class
{
    void Map(EntityTypeBuilder<T> builder);
}

public static class EntityMappingExtensions
{
     public static ModelBuilder RegisterEntityMapping<TEntity, TMapping>(this ModelBuilder builder) 
        where TMapping : IEntityMappingConfiguration<TEntity> 
        where TEntity : class
    {
        var mapper = (IEntityMappingConfiguration<TEntity>)Activator.CreateInstance(typeof (TMapping));
        mapper.Map(builder.Entity<TEntity>());
        return builder;
    }
}

ব্যবহার:

আপনার প্রসঙ্গের অনমোডেল ক্রিয়েটিং পদ্ধতিতে:

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        builder
            .RegisterEntityMapping<Card, CardMapping>()
            .RegisterEntityMapping<User, UserMapping>();
    }

ম্যাপিং ক্লাসের উদাহরণ:

public class UserMapping : IEntityMappingConfiguration<User>
{
    public void Map(EntityTypeBuilder<User> builder)
    {
        builder.ToTable("User");
        builder.HasKey(m => m.Id);
        builder.Property(m => m.Id).HasColumnName("UserId");
        builder.Property(m => m.FirstName).IsRequired().HasMaxLength(64);
        builder.Property(m => m.LastName).IsRequired().HasMaxLength(64);
        builder.Property(m => m.DateOfBirth);
        builder.Property(m => m.MobileNumber).IsRequired(false);
    }
}

ভিজ্যুয়াল স্টুডিও 2015 এর ভাঁজ আচরণের সুযোগ নিতে আমি আরও একটি জিনিস করতে চাই তা হ'ল 'ব্যবহারকারী' নামক একটি সত্তার জন্য, আপনি নিজের ম্যাপিং ফাইলটির নাম দিন 'ব্যবহারকারী.ম্যাপিং.সিএস', ভিজুয়াল স্টুডিও ফাইলটি সমাধান এক্সপ্লোরারটিতে ভাঁজ করবেন যাতে এটি সত্তা শ্রেণীর ফাইলের অন্তর্ভুক্ত থাকে।


আপনার সমাধানের জন্য আপনাকে ধন্যবাদ। আমি আমার প্রকল্পের শেষে আমার সমাধান কোডটি অনুকূলিত করব ... আমি ভবিষ্যতে এটি নিশ্চিত করে দেখছি।
মিরোস্লাভ সিসকা

আমি কেবল 'আইটিটিটিটাইপস কনফিগারেশন <T>' ধরে নিতে পারি এবং ২০১ in-তে Configure(builder)উপস্থিত ছিল না? টাইপ কনফিগারেশনে নির্দেশ করার জন্য তারের সামান্য পরিবর্তনের সাথে, 'অতিরিক্ত' ইন্টারফেসের প্রয়োজন নেই।
ওয়ার্নারসিডি

3

আমি এই সমাধানটি দিয়ে শেষ করেছি:

public interface IEntityMappingConfiguration
{
    void Map(ModelBuilder b);
}

public interface IEntityMappingConfiguration<T> : IEntityMappingConfiguration where T : class
{
    void Map(EntityTypeBuilder<T> builder);
}

public abstract class EntityMappingConfiguration<T> : IEntityMappingConfiguration<T> where T : class
{
    public abstract void Map(EntityTypeBuilder<T> b);

    public void Map(ModelBuilder b)
    {
        Map(b.Entity<T>());
    }
}

public static class ModelBuilderExtenions
{
    private static IEnumerable<Type> GetMappingTypes(this Assembly assembly, Type mappingInterface)
    {
        return assembly.GetTypes().Where(x => !x.IsAbstract && x.GetInterfaces().Any(y => y.GetTypeInfo().IsGenericType && y.GetGenericTypeDefinition() == mappingInterface));
    }

    public static void AddEntityConfigurationsFromAssembly(this ModelBuilder modelBuilder, Assembly assembly)
    {
        var mappingTypes = assembly.GetMappingTypes(typeof (IEntityMappingConfiguration<>));
        foreach (var config in mappingTypes.Select(Activator.CreateInstance).Cast<IEntityMappingConfiguration>())
        {
            config.Map(modelBuilder);
        }
    }
}

নমুনা ব্যবহার:

public abstract class PersonConfiguration : EntityMappingConfiguration<Person>
{
    public override void Map(EntityTypeBuilder<Person> b)
    {
        b.ToTable("Person", "HumanResources")
            .HasKey(p => p.PersonID);

        b.Property(p => p.FirstName).HasMaxLength(50).IsRequired();
        b.Property(p => p.MiddleName).HasMaxLength(50);
        b.Property(p => p.LastName).HasMaxLength(50).IsRequired();
    }
}

এবং

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.AddEntityConfigurationsFromAssembly(GetType().Assembly);
}

আমি একটি সংকলন-সময় ত্রুটি পেয়ে যাচ্ছি: " অপারেটর '! X.IsAbstract' মডেলবিল্ডার এক্সটেনশনস.গেটম্যাপিংটাইপস () 'তে'! X.IsAbstract '(System.Type.IsAbstract) টাইপ' পদ্ধতি গ্রুপ 'অপারেন্ড করতে প্রয়োগ করা যাবে না। । আমার কি এমস্কোরলিবের একটি রেফারেন্স যুক্ত করতে হবে? .NET কোর 1.0 প্রকল্পে আমি কীভাবে এটি করব?
র্যান্ডিডাডিস

। নেট কোর প্রকল্পগুলির জন্য (নেটস্ট্যান্ডার্ড ব্যবহার করে) আপনাকে সিস্টেমে এক্সটেনশন গেটটাইপআইএনফো () ব্যবহার করতে হবে efনির্বাচন নেমস্পেস। । যেমন x.GetTypeInfo () IsAbstract বা x.GetTypeInfo () ব্যবহার GetInterfaces ()।
animalito maquina

আমি আপনার সমাধানের অংশটি ব্যবহার করেছি এবং এটি দুর্দান্ত কাজ করেছে। ধন্যবাদ!
দিয়েগো কোটিনি

2

স্রেফ আইএনটিটিটাইপস কনফিগারেশন বাস্তবায়ন করুন

public abstract class EntityTypeConfiguration<TEntity> : IEntityTypeConfiguration<TEntity> where TEntity : class
{
    public abstract void Configure(EntityTypeBuilder<TEntity> builder);
}

এবং তারপরে এটি আপনার সত্তা প্রসঙ্গে যুক্ত করুন

public class ProductContext : DbContext, IDbContext
{
    public ProductContext(DbContextOptions<ProductContext> options)
        : base((DbContextOptions)options)
    {
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.ApplyConfiguration(new ProductMap());
    }

    public DbSet<Entities.Product> Products { get; set; }
}

1

ইফ কোরটিতে আমাদের এনটিটিটাইপস কনফিগারেশনের পরিবর্তে আইএনটিটিটাইপস কনফিগারেশন প্রয়োগ করতে হবে এই ক্ষেত্রে আমাদের ডিবি কনটেক্সট মডেল বিল্ডারের সম্পূর্ণ অ্যাক্সেস রয়েছে এবং আমরা সাবলীল এপিআই ব্যবহার করতে পারি তবে ইফ কোরটিতে এই এপিআই পূর্ববর্তী সংস্করণগুলি থেকে একটি লিটল বিট ডাইভারেন্ট is আপনি ই-কোর মডেল কনফিগারেশনে আরও বিশদ জানতে পারেন

https://www.learnentityframeworkcore.com/configuration/fluent-api


1

সত্তা ফ্রেমওয়ার্ক কোর 2.0 তে:

আমি কোকোয়ালার উত্তর নিয়েছি এবং এটি v2.0 এর সাথে অভিযোজিত করেছি:

    public static class ModelBuilderExtenions
    {
        private static IEnumerable<Type> GetMappingTypes(this Assembly assembly, Type mappingInterface)
        {
            return assembly.GetTypes().Where(x => !x.IsAbstract && x.GetInterfaces().Any(y => y.GetTypeInfo().IsGenericType && y.GetGenericTypeDefinition() == mappingInterface));
        }

        public static void AddEntityConfigurationsFromAssembly(this ModelBuilder modelBuilder, Assembly assembly)
        {
            // Types that do entity mapping
            var mappingTypes = assembly.GetMappingTypes(typeof(IEntityTypeConfiguration<>));

            // Get the generic Entity method of the ModelBuilder type
            var entityMethod = typeof(ModelBuilder).GetMethods()
                .Single(x => x.Name == "Entity" &&
                        x.IsGenericMethod &&
                        x.ReturnType.Name == "EntityTypeBuilder`1");

            foreach (var mappingType in mappingTypes)
            {
                // Get the type of entity to be mapped
                var genericTypeArg = mappingType.GetInterfaces().Single().GenericTypeArguments.Single();

                // Get the method builder.Entity<TEntity>
                var genericEntityMethod = entityMethod.MakeGenericMethod(genericTypeArg);

                // Invoke builder.Entity<TEntity> to get a builder for the entity to be mapped
                var entityBuilder = genericEntityMethod.Invoke(modelBuilder, null);

                // Create the mapping type and do the mapping
                var mapper = Activator.CreateInstance(mappingType);
                mapper.GetType().GetMethod("Configure").Invoke(mapper, new[] { entityBuilder });
            }
        }


    }

এবং এটি ডিবি কনটেক্সটে এভাবে ব্যবহার করা হয়:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.AddEntityConfigurationsFromAssembly(GetType().Assembly);
    }

এবং এভাবেই আপনি কোনও সত্তার জন্য সত্তা টাইপ কনফিগারেশন তৈরি করেন:

    public class UserUserRoleEntityTypeConfiguration : IEntityTypeConfiguration<UserUserRole>
    {
        public void Configure(EntityTypeBuilder<UserUserRole> builder)
        {
            builder.ToTable("UserUserRole");
            // compound PK
            builder.HasKey(p => new { p.UserId, p.UserRoleId });
        }
    }

আমার পক্ষে কাজ করেনি। ব্যতিক্রম:Late bound operations cannot be performed on types or methods for which ContainsGenericParameters is true.
তোহিদ

PS: সমাধানটি খুঁজে পেয়েছে: &&! T.IsGeneric টাইপ। কারণ আমার একটি বেস ক্লাস ছিল যা জেনেরিক ( class EntityTypeConfigurationBase<TEntity> : IEntityTypeConfiguration<TEntity>)। আপনি এই বেস শ্রেণীর উদাহরণ তৈরি করতে পারবেন না।
তোহিদ

0

আমি কি সঠিক?

public class SmartModelBuilder<T> where T : class         {

    private ModelBuilder _builder { get; set; }
    private Action<EntityTypeBuilder<T>> _entityAction { get; set; }

    public SmartModelBuilder(ModelBuilder builder, Action<EntityTypeBuilder<T>> entityAction)
    {
        this._builder = builder;
        this._entityAction = entityAction;

        this._builder.Entity<T>(_entityAction);
    }
}   

আমি কনফিগার পাস করতে পারি:

 protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
        // Customize the ASP.NET Identity model and override the defaults if needed.
        // For example, you can rename the ASP.NET Identity table names and more.
        // Add your customizations after calling base.OnModelCreating(builder);



        new SmartModelBuilder<Blog>(builder, entity => entity.Property(b => b.Url).Required());

    } 

গৃহীত উত্তর এর চেয়ে ভাল বলে মনে হচ্ছে। উভয়টিতে ব্যাপকভাবে বিশৃঙ্খল অনমোডেলক্রিটিং () থাকার একই নেতিবাচক পার্শ্ব-প্রতিক্রিয়া রয়েছে তবে স্বীকৃত উত্তরের কোনও সহায়ক শ্রেণীর প্রয়োজন নেই। আমি কি অনুপস্থিত কিছু আছে যে আপনার উত্তর উন্নতি?
জুডোকে

0

মাইক্রোসফ্ট যেভাবে ফোরস্ক্লার সার্ভারটোটেবল প্রয়োগ করেছিল তার অনুরূপ পন্থা অনুসরণ করেছি

এক্সটেনশন পদ্ধতি ব্যবহার করে ...

আংশিক পতাকা প্রয়োজন বোধ করা হয় আপনি একাধিক ফাইল একই বর্গ নাম ব্যবহার করতে চান

public class ConsignorUser
{
    public int ConsignorId { get; set; }

    public string UserId { get; set; }

    public virtual Consignor Consignor { get; set; }
    public virtual User User { get; set; }

}

public static partial class Entity_FluentMappings
{
    public static EntityTypeBuilder<ConsignorUser> AddFluentMapping<TEntity> (
        this EntityTypeBuilder<ConsignorUser> entityTypeBuilder) 
        where TEntity : ConsignorUser
    {
       entityTypeBuilder.HasKey(x => new { x.ConsignorId, x.UserId });
       return entityTypeBuilder;
    }      
}

তারপরে ডেটা কনটেক্সট অনমোডেলক্রিটিংয়ে প্রতিটি এক্সটেনশনের জন্য আপনার কল করুন ...

 public class DataContext : IdentityDbContext<User>
{

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
        // Customize the ASP.NET Identity model and override the defaults if needed.
        // For example, you can rename the ASP.NET Identity table names and more.
        // Add your customizations after calling base.OnModelCreating(builder);

        builder.Entity<ConsignorUser>().AddFluentMapping<ConsignorUser>();
        builder.Entity<DealerUser>().AddFluentMapping<DealerUser>();           

    }

এইভাবে আমরা অন্যান্য নির্মাতা পদ্ধতি দ্বারা ব্যবহৃত একই প্যাটার্নটি অনুসরণ করছি

আপনি কি জিনিস না?


0

ভাল এখানে EF7 গিথুব রেপো উন্নত করার জন্য সমস্যাটি এখানে রয়েছে: https://github.com/aspnet/EntityFramework/issues/2805

আপনি সেখানে সরাসরি সমস্যাটি ট্র্যাক করতে পারেন, এটি কেবলমাত্র মনোনীত অগ্রাধিকার ছাড়াই ব্যাকলগে রয়েছে।


"ভাল ডিজাইন করা জিনিসগুলি বন্ধ করা বন্ধ করুন" এর মতো একটি সমস্যা হওয়া উচিত।
কামিল

0

আমার একটি প্রকল্প রয়েছে যা আপনাকে বাহ্যিক DbContext.OnModelCreatingউত্তরাধিকার সূত্রে পৃথক শ্রেণিতে প্রতিটি সত্তা কনফিগার করে আপনি বাইরে সত্তা কনফিগার করতে দেয়StaticDotNet.EntityFrameworkCore.ModelConfiguration.EntityTypeConfiguration

প্রথমে আপনাকে এমন একটি শ্রেণি তৈরি করতে হবে যা আপনি কনফিগার করতে চান এমন ক্লাসটি StaticDotNet.EntityFrameworkCore.ModelConfiguration.EntityTypeConfiguration<TEntity>কোথা থেকে উত্তরাধিকার সূত্রে আসে TEntity

using StaticDotNet.EntityFrameworkCore.ModelConfiguration;
using Microsoft.EntityFrameworkCore.Metadata.Builders;

public class ExampleEntityConfiguration
    : EntityTypeConfiguration<ExampleEntity>
{
    public override void Configure( EntityTypeBuilder<ExampleEntity> builder )
    {
        //Add configuration just like you do in DbContext.OnModelCreating
    }
}

তারপরে আপনার স্টার্টআপ ক্লাসে আপনাকে সত্ত্বা ফ্রেমওয়ার্কটি বলতে হবে যখন আপনি আপনার ডিবি কনটেক্সটটি কনফিগার করছেন তখন আপনার সমস্ত কনফিগারেশন ক্লাস কোথায় পাওয়া যায়।

using StaticDotNet.EntityFrameworkCore.ModelConfiguration;

public void ConfigureServices(IServiceCollection services)
{
    Assembly[] assemblies = new Assembly[]
    {
        // Add your assembiles here.
    };

    services.AddDbContext<ExampleDbContext>( x => x
        .AddEntityTypeConfigurations( assemblies )
    );
}

সরবরাহকারী ব্যবহার করে টাইপ কনফিগারেশন যুক্ত করার জন্য একটি বিকল্প রয়েছে। এটি কীভাবে ব্যবহার করবেন সে সম্পর্কে রেপোর সম্পূর্ণ ডকুমেন্টেশন রয়েছে।

https://github.com/john-t-white/StaticDotNet.EntityFrameworkCore.ModelConfiguration


দয়া করে একাধিক প্রশ্নের একই উত্তর পোস্ট করবেন না। যদি একই তথ্য সত্যই উভয় প্রশ্নের উত্তর দেয়, তবে একটি প্রশ্ন (সাধারণত নতুন একটি) অন্যটির নকল হিসাবে বন্ধ করা উচিত। আপনি এটি সদৃশ হিসাবে বন্ধ করার জন্য ভোট দিয়ে ইঙ্গিত করতে পারেন বা যদি এর পক্ষে আপনার যথেষ্ট খ্যাতি না থাকে তবে এটি একটি নকল হিসাবে চিহ্নিত করতে একটি পতাকা বাড়াতে । অন্যথায়, নিশ্চিত হয়ে নিন যে আপনি এই প্রশ্নের উত্তরটি উপযুক্ত করেছেন এবং একই উত্তরটি একাধিক জায়গায় পেস্ট করবেন না।
এলেক্সেনাইড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.