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

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

是否可以将实体的ModelBuilders放在不同的文件中?我们正试图将自动脚手架和数据库分开,并有一定的手动定制。

这是我正在尝试的,收到的错误如下。

文件1:《中国国家地理》,文件2:《中国国家地理》,文件3:《中国国家地理》,文件4:《中国国家地理》,文件5:《中国国家地理》,文件6:《中国国家地理》,文件7:《中国国家地理》,文件8:《中国国家地理》,文件9:《中国国家地理》,文件10:《中国国家地理》,文件10:《中国国家地理》,文件11:《中国国家地理》,文件11:《中国国家地理》,文件11:《中国国家地理》,文件11:《中国国家地理》,文件11:《中国国家地理》,文件11:《中国国家地理》,文件11:《中国国家地理》,文件11:《中国国家地理》,文件11:《中国国家地理》,文件11:《中国国家地理》,文件11:《中国国家地理》,文件11:《中国国家地理》,文件11:《中国国家地理》,文件11:《中国国家地理》,文件11:《中国国家地理》。

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 Error CS1501 "Entity "方法没有重载,需要两个参数。

能否有部分类的方法论?

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

如果你想让每个实体都有一个文件,那么,不要使用模型生成器,而使用 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从给定的文件中加载实体配置。

然后您需要告诉 Entity Framework 从给定的文件中加载实体配置。Assembly:

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

1
投票

你可以通过设置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");
               });
            }           
        }

你可以参考 这个.


0
投票

我真的不知道为什么你要为一个实体建立单独的配置文件。然而,根据你提供的内容,你可以这样做。

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

如果你想为不同的实体定义配置,有更简单的方法来实现。

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