Entity Framework ModelBuilder在两个不同的文件中吗?

问题描述 投票:0回答:3

是否可以将ModelBuilder for Entities放在不同的文件中?我们正在尝试从数据库中分离自动脚手架,并进行某些手动定制。

这是我正在尝试的操作,下面收到错误,

文件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方法'Entity'的重载没有2个参数

是否可以为此使用部分类方法?

c# .net entity-framework asp.net-core dbcontext
3个回答
0
投票

我真的不知道为什么您要为单个实体使用单独的配置文件。但是,根据您提供的内容,可以执行以下操作:

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

如果要为单独的实体定义配置,则有更简洁的方法。


0
投票

如果要每个实体有一个文件,则不要使用模型构建器,而要使用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的属性将自动映射为主键,依此类推。

然后您需要告诉实体框架从给定Assembly中找到的文件中加载实体配置:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder
      .ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly()); 
}

0
投票

您可以通过将dbcontext类设置为partial,在两个文件中创建部分类,然后在其中一个文件中定义一个方法来传递ModelBuilder参数来实现。

有关详细信息,请参阅以下内容。

文件1:

  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

© www.soinside.com 2019 - 2024. All rights reserved.