Entity Framework ModelBuilder в двух разных файлах? - PullRequest
0 голосов
/ 06 мая 2020

Возможно ли, чтобы ModelBuilders для Entities находился в разных файлах? Мы пытаемся отделить автоматические c строительные леса от базы данных, а также выполнить некоторую ручную настройку.

Это то, что я пытаюсь сделать, получив ошибку ниже,

Файл 1:

modelBuilder.Entity<PropertyMailingAddress>(entity =>
{
    entity.HasOne(d => d.LkAddressType)
        .WithMany(p => p.PropertyMailingAddress)
        .HasForeignKey(d => d.LkAddressTypeId)
        .HasConstraintName("FK_PropertyMailingAddress_LK_AddressTypeId");

Файл 2:

modelBuilder.Entity<PropertyMailingAddress>(entity =>
{

    entity.HasOne(d => d.LkSourceOfAddress)
        .WithMany(p => p.PropertyMailingAddress)
        .HasForeignKey(d => d.LkSourceOfAddressId)
        .HasConstraintName("FK_PropertyMailingAddress_LK_SourceOfAddressId");

Ошибка CS1501 Отсутствие перегрузки для метода «Сущность» принимает 2 аргумента

Возможна ли для этого методология частичного класса?

Ответы [ 3 ]

1 голос
/ 06 мая 2020

Если вы хотите иметь файл для каждой сущности, тогда вместо использования Построителя моделей используйте IEntityTypeConfiguration. Создайте класс, реализующий IEntityTypeConfiguration<T> для каждой сущности. Например:

public class PropertyMailingAddressConfig : IEntityTypeConfiguration<PropertyMailingAddress>
{
  public void Configure(EntityTypeBuilder<PropertyMailingAddress> builder)
  {
     builder
       .HasOne(d => d.LkAddressType);
       .WithMany(p => p.PropertyMailingAddress);
       .HasForeignKey(d => d.LkAddressTypeId)
       .HasConstraintName("FK_PropertyMailingAddress_LK_AddressTypeId");
  }
}  

Соглашения по умолчанию применяются таким же образом, поэтому свойство с именем Id будет автоматически отображаться как первичный ключ и т. Д.

Затем вам нужно сообщить Entity Framework загрузить конфигурации сущностей из файлов, найденных в заданном Assembly:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder
      .ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly()); 
}
0 голосов
/ 07 мая 2020

Вы можете сделать это, установив класс dbcontext на partial, создав частичный класс в двух файлах, а затем определив метод в одном из файлов для передачи параметров ModelBuilder.

Для подробности см. в следующем.

File1:

  public partial class MyDbContext: DbContext
    {
        public DbContext(DbContextOptions<MyDbContext> options)
            : base(options)
        {
        }
        public DbSet<PropertyMailingAddress> PropertyMailingAddress{ get; set; } 

        partial void OnModelCreatingPartial(ModelBuilder modelBuilder);

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            OnModelCreatingPartial(modelBuilder);

            modelBuilder.Entity<PropertyMailingAddress>(entity =>
            {
              entity.HasOne(d => d.LkAddressType)
                    .WithMany(p => p.PropertyMailingAddress)
                    .HasForeignKey(d => d.LkAddressTypeId)
                    .HasConstraintName("FK_PropertyMailingAddress_LK_AddressTypeId");
            });  
        }
    }

File2:

     public partial class MyDbContext : DbContext
        {
            partial void OnModelCreatingPartial(ModelBuilder modelBuilder)
            {
               modelBuilder.Entity<PropertyMailingAddress>(entity =>
               {    

                  entity.HasOne(d => d.LkSourceOfAddress)
                        .WithMany(p => p.PropertyMailingAddress)
                        .HasForeignKey(d => d.LkSourceOfAddressId)

 .HasConstraintName("FK_PropertyMailingAddress_LK_SourceOfAddressId");
               });
            }           
        }

Вы можете обратиться к this .

0 голосов
/ 06 мая 2020

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

public partial static class MyExtensions
{
 public static void ConfigureMyEntity(this ModelBuilder modelBuilder)
{
modelBuilder.Entity<MyEntity>()
.HasOne<Other>()
.WithMany()
....
}
}

Если вы хотите определить конфигурации для отдельных сущностей, есть более простые способы сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...