是否可以将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个参数
是否可以为此使用部分类方法?
我真的不知道为什么您要为单个实体使用单独的配置文件。但是,根据您提供的内容,可以执行以下操作:
public partial static class MyExtensions
{
public static void ConfigureMyEntity(this ModelBuilder modelBuilder)
{
modelBuilder.Entity<MyEntity>()
.HasOne<Other>()
.WithMany()
....
}
}
如果要为单独的实体定义配置,则有更简洁的方法。
如果要每个实体有一个文件,则不要使用模型构建器,而要使用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());
}
您可以通过将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。