Ánh xạ lõi của EntityTypeConfiguration


129

Trong EF6 chúng ta thường có thể sử dụng cách này để định cấu hình Thực thể.

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

Làm thế nào chúng ta có thể làm trong EF Core, kể từ khi lớp I Kế thừa EntityTypeConfiguration không thể tìm thấy lớp.

Tôi tải xuống mã nguồn thô EF Core từ GitHub, tôi không thể tìm thấy nó. Ai đó có thể giúp đỡ về điều này?


8
Tại sao không chấp nhận câu trả lời đó?
Den

kể từ khi nó ở phiên bản beta5, khi chúng tôi đặt maxLpm (50). trong db nó tạo ra nvarchar (tối đa)
Herman

6
Đối với bất kỳ ai khác quan tâm đến điều này, giờ đây IEntityTypeConfiguration<T>có một void Configure()phương pháp mà bạn có thể thực hiện. Chi tiết tại đây: github.com/aspnet/EntityFramework/pull/6989
Galilyou

Câu trả lời:


183

Kể từ khi có EF Core 2.0 IEntityTypeConfiguration<TEntity>. Bạn có thể sử dụng nó như thế này:

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

Thông tin thêm về điều này và các tính năng mới khác được giới thiệu trong 2.0 có thể được tìm thấy ở đây .


8
Đây là câu trả lời tốt nhất cho EF Core 2.0. Cảm ơn!
Collin M. Barrett

2
Thật tuyệt vời. Tôi đang tìm cách tách các định nghĩa API trôi chảy. Cảm ơn
Blaze

Đồng thời xem câu trả lời này cho "ToTable" và "HasColumnName", vv ::: stackoverflow.com/questions/43200184/
Kẻ

nếu bạn có cấu hình tùy chỉnh người đàn ông, chỉ cần đặt builder.ApplyConfigurationsFromAssembly(typeof(ApplicationDbContext).Assembly);nó sẽ áp dụng tất cả các xác nhận tùy chỉnh
alim91

52

Bạn có thể đạt được điều này thông qua một số loại bổ sung đơn giản:

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

Sử dụng:

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
Ở đâu ForSqlServerToTable()?
im1dermike


1
Làm thế nào để sử dụng HasColumnType với điều này? . Ví dụ. entity.Property(c => c.JoinDate).HasColumnType("date");
Biju Soman

OnModelCreatingđã được cập nhật để yêu cầu a DbModelBuilder. Cách để thêm cấu hình vào đây là bây giờmodelBuilder.Configurations.Add(new UserConfiguration());
Izzy

2
@Izzy - DbModelBuilder là Entity Framework 6.0, ModelBuilder là EF Core. Chúng là các hội đồng khác nhau và trong trường hợp này, câu hỏi được dành riêng cho EF Core.
Jason

29

Trong EF7, bạn ghi đè OnModelCreating trên lớp DbContext bạn đang triển khai.

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
Vì vậy, nếu tôi có 20 cấu hình loại thực thể, tôi đặt chúng trong một phương thức lớn?
Den

6
Theo mặc định, có vẻ như vậy. Bạn có thể tạo các lớp FooMapper / FooModelBuilder của riêng mình để mở rộng một lớp cơ sở và có một phương thức mà bạn vượt qua một EntityBuilder đã gõ <Foo>. Bạn thậm chí có thể sử dụng giao diện tiêm phụ thuộc mới và giao diện IConfiguration để tự động phát hiện / gọi chúng cho bạn, nếu bạn muốn trở nên lạ mắt!
Avi Cherry

1
Không có gì. Bỏ phiếu một câu trả lời (và khuyến khích người hỏi chấp nhận nó) thậm chí còn tốt hơn!
Avi Cherry

Tôi thường làm điều này :)
Den

4
Hãy thử các công cụ tiêm phụ thuộc mới? Tạo một IEntityMapperStrategygiao diện với một void MapEntity(ModelBuilder, Type)chữ ký và bool IsFor(Type). Triển khai giao diện nhiều lần hoặc vài lần bạn muốn (để bạn có thể tạo các lớp có thể ánh xạ nhiều hơn một thực thể nếu bạn muốn) và sau đó tạo một lớp khác (nhà cung cấp chiến lược) tiêm một IEnumerabletrong tất cả các thực thể IEntityMapperStrategies. Xem ở đây dưới 'Loại đặc biệt'. Tiêm nó vào bối cảnh của bạn.
Avi Cherry

22

Đây là bản sử dụng mới nhất, beta 8. Hãy thử điều này:

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

Sau đó, trong DbContext của bạn:

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

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

3
Tôi cuối cùng đã làm tương tự như thế này. Tôi đã quyết định sử dụng một phương thức tĩnh thay vì một constructor mặc dù.
Matt Sanders

Tôi đang sử dụng phương pháp này và cho đến thời điểm này tôi không gặp vấn đề gì ngoại trừ việc thừa kế. Nếu tôi muốn kế thừa AccountMap trong ví dụ của bạn thành một cái mới và thêm khóa thay thế - cách tiếp cận tốt nhất là gì?
chris

14

Bạn có thể sử dụng sự phản chiếu để thực hiện mọi thứ rất giống với cách chúng hoạt động trong EF6, với một lớp ánh xạ riêng cho mỗi thực thể. Điều này hoạt động trong trận chung kết RC1:

Đầu tiên, tạo một giao diện cho các loại ánh xạ của bạn:

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

Sau đó, tạo một lớp ánh xạ cho mỗi thực thể của bạn, ví dụ cho một Personlớp:

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

Bây giờ, phép thuật phản chiếu OnModelCreatingtrong DbContextviệc thực hiện của bạn :

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

Những gì tham khảo DataContext.Wheresử dụng? Tôi đã thực hiện một dự án riêng cho việc này và dường như không tìm thấy tài liệu tham khảo.
Ruchan

.WhereSystem.Linq, DataContextlà lớp nơi mã được thêm vào (hàm EF của tôi DbContext)
Cocowalla

12

Vì EF Core 2.2, bạn có thể thêm tất cả các cấu hình (các lớp đã triển khai giao diện IEntityTypeConfiguration) trong một dòng trong phương thức OnModelCreating trong lớp, được kế thừa từ lớp DbContext

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

Và, như đã được đề cập trong câu trả lời trước, kể từ EF Core 2.0, bạn có thể triển khai giao diện IEntityTypeConfiguration, thiết lập cấu hình ánh xạ bằng cách sử dụng FluentAPI trong phương thức Cấu hình.

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

Đây là những gì tôi đang làm trong một dự án tôi đang làm.

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

Sử dụng:

Trong phương thức OnModelCreating của Context của bạn:

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

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

Lớp ánh xạ mẫu:

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

Một điều khác tôi muốn làm để tận dụng hành vi gấp của Visual Studio 2015 là dành cho một Thực thể có tên là 'Người dùng', bạn đặt tên cho tệp ánh xạ của mình là 'User.Micking.cs', Visual Studio sẽ gấp tệp trong trình khám phá giải pháp để nó được chứa trong tệp lớp thực thể.


Cảm ơn bạn cho giải pháp của bạn. Tôi sẽ tối ưu hóa mã giải pháp vào cuối dự án của mình ... Tôi kiểm tra chắc chắn trong tương lai.
Miroslav Siska

Tôi chỉ có thể giả sử 'IEntityTypeConfiguration <T>' và Configure(builder)không tồn tại vào năm 2016? Với một chút thay đổi về hệ thống dây để trỏ đến TypeConfiguration, không cần giao diện 'phụ'.
WernerCD

3

Tôi đã kết thúc với giải pháp này:

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

Sử dụng mẫu:

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

Tôi đang gặp lỗi thời gian biên dịch: " Toán tử '! X.Is Ab khu vực' không thể được áp dụng cho toán hạng của loại 'nhóm phương thức' " trên '! X.IsAb khu vực' (System.Type.IsAb khu vực) trong ModelBuilderExtenions.GetMappingTypes () . Tôi có cần thêm một tham chiếu đến mscorlib không? Làm thế nào để tôi làm điều đó với một dự án .NET Core 1.0?
RandyDaddis

đối với các dự án lõi .net (sử dụng netst Chuẩn), bạn cần sử dụng tiện ích mở rộng GetTypeInfo () trong không gian tên System.Reflection. Sử dụng như x.GetTypeInfo () isAbstract hoặc x.GetTypeInfo () getInterfaces ()..
animalito maquina

Tôi đã sử dụng một phần giải pháp của bạn và nó hoạt động rất tốt. Cảm ơn!
Diego Cotini

2

Chỉ cần thực hiện IEntityTypeConfiguration

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

và sau đó thêm nó vào Bối cảnh thực thể của bạn

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

Trong lõi ef, chúng ta phải cải thiện IEntityTypeConfiguration thay vì EntityTypeConfiguration trong trường hợp này, chúng ta có toàn quyền truy cập vào mô hình DbContext và chúng ta có thể sử dụng api trôi chảy nhưng trong lõi ef này là một bit khác với các phiên bản trước. bạn có thể tìm thêm chi tiết về cấu hình mô hình lõi ef trên

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


1

Trong Entity Framework Core 2.0:

Tôi lấy câu trả lời của Cocowalla và điều chỉnh nó cho phiên bản 2.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 });
            }
        }


    }

Và nó được sử dụng trong DbContext như thế này:

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

Và đây là cách bạn tạo cấu hình loại thực thể cho thực thể:

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

Không làm việc cho tôi. Ngoại lệ:Late bound operations cannot be performed on types or methods for which ContainsGenericParameters is true.
Tohid

PS: Đã tìm thấy giải pháp: &&! T.IsGenericType. Bởi vì tôi đã có một lớp cơ sở là một lớp chung ( class EntityTypeConfigurationBase<TEntity> : IEntityTypeConfiguration<TEntity>). Bạn không thể tạo một thể hiện của lớp cơ sở này.
Tohid

0

Tôi có đúng không

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

Tôi có thể vượt qua cấu hình:

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

    } 

Câu trả lời được chấp nhận có vẻ tốt hơn thế này. Cả hai đều có cùng tác dụng phụ tiêu cực là có một OnModelCreating () lộn xộn ồ ạt nhưng câu trả lời được chấp nhận không yêu cầu bất kỳ lớp trợ giúp nào. Có điều gì tôi đang thiếu mà câu trả lời của bạn được cải thiện?
Đi thuyền Judo

0

Tôi đã làm theo một cách tiếp cận tương tự như cách Microsoft triển khai ForSqlServerToTable

sử dụng phương pháp mở rộng ...

các phần cờ là cần thiết nếu bạn muốn sử dụng tên lớp giống nhau ở nhiều file

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

Sau đó, trong DataContext OnModelCreating thực hiện cuộc gọi của bạn cho mỗi tiện ích mở rộng ...

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

    }

Bằng cách này, chúng tôi đang theo cùng một mẫu được sử dụng bởi các phương thức xây dựng khác.

Bạn làm gì



0

Tôi có một dự án cho phép bạn định cấu hình các thực thể bên ngoài DbContext.OnModelCreatingBạn định cấu hình từng thực thể trong một lớp riêng biệt kế thừa từStaticDotNet.EntityFrameworkCore.ModelConfiguration.EntityTypeConfiguration

Trước tiên, bạn cần phải tạo ra một lớp mà kế thừa từ StaticDotNet.EntityFrameworkCore.ModelConfiguration.EntityTypeConfiguration<TEntity>nơi TEntitylà lớp bạn muốn cấu hình.

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

Sau đó, trong lớp Khởi động của bạn, bạn chỉ cần cho Entity Framework biết nơi tìm tất cả các lớp cấu hình của bạn khi bạn định cấu hình DbContext của mình.

using StaticDotNet.EntityFrameworkCore.ModelConfiguration;

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

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

Ngoài ra còn có một tùy chọn để thêm cấu hình loại bằng cách sử dụng một nhà cung cấp. Các repo có tài liệu đầy đủ về cách sử dụng nó.

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


Xin vui lòng không gửi cùng một câu trả lời cho nhiều câu hỏi. Nếu cùng một thông tin thực sự trả lời cả hai câu hỏi, thì một câu hỏi (thường là câu hỏi mới hơn) nên được đóng lại như một bản sao của câu hỏi khác. Bạn có thể chỉ ra điều này bằng cách bỏ phiếu để đóng nó dưới dạng trùng lặp hoặc, nếu bạn không đủ danh tiếng cho điều đó, hãy giơ cờ để cho biết đó là bản sao. Mặt khác, hãy chắc chắn rằng bạn điều chỉnh câu trả lời của mình cho câu hỏi này và không chỉ dán cùng một câu trả lời ở nhiều nơi.
elixenide
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.