c# - HasOne 与 OneToMany 的映射关系
问题描述
public class Car
{
public int Id { get; set; }
public string Name { get; set; }
public Owner Owner { get; set; }
}
public class Owner
{
public int Id { get; set; }
public string Name { get; set; }
public IEnumerable<Country> VisitedCountries { get; set; }
}
public class Country
{
public int Id { get; set; }
public string Name { get; set;
public Owner Owner { get; set; }
}
我将这种关系映射为
public class CarConfiguration : IEntityTypeConfiguration<Car>
{
public void Configure(EntityTypeBuilder<Car> builder)
{
builder.ToTable("Car");
builder.HasKey(x => x.Id);
builder.Property(x => x.Id).HasColumnName("Id").ValueGeneratedOnAdd();
builder.HasOne(x => x.Owner);
}
}
至于现在,我将 OwnerConfiguration 文件添加为单独的配置文件
public void Configure(EntityTypeBuilder<Owner> builder)
{
builder.ToTable("Owner");
builder.HasMany(x => x.VisitedCountries);
...
}
我的问题是:如何重构它并仅在地图配置文件(例如 CarConfiguration)上使用并删除 OwnerConfiguration 文件?
解决方案
对于IEntityTypeConfiguration
,它允许将实体类型的配置分解为单独的类,并且您不能将其用于不同的模型。
一般来说,有两种方式来配置模型,IEntityTypeConfiguration
在单独的文件中和OnModelCreating
直接配置。
在机型较多的情况下,建议IEntityTypeConfiguration
单独配置,配置方便。如果你只是想避免配置modelBuilder.ApplyConfiguration(new CarConfiguration());
,你可以试试 like modelBuilder.ApplyEntityTypeConfigurations(Assembly.GetExecutingAssembly());
。
如果你想有一个地方进行配置,你可以OnModelCreating
按照
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<Car>(c =>
{
c.ToTable("Car");
c.HasKey(x => x.Id);
c.Property(x => x.Id).HasColumnName("Id").ValueGeneratedOnAdd();
c.HasOne(x => x.Owner);
});
}
推荐阅读
- .htaccess - Htaccess 301 重定向规则/HTTP 到 HTTPS/非 www 到 www
- ios - 为模拟器构建时“重新定义模块......”
- java - 具有继承问题的反应式 WebTestClient json 反序列化
- php - 如何在 php 中的 Google Adwords API 中设置多个 ClientCustomerId?
- excel - 无论文件路径如何,VBA 中的 QueryTables.Add 都会添加相同的文件
- database-design - 数据库设计:两个不同地方的两个表之间的多对多关系
- select - 学说 2 如何从选择查询中插入表值
- bash - 在 HP-UX 框中比较日期的语法 - 未找到错误
- citrus-framework - 如何使用 citrus 测试框架发送复杂的消息头
- swift - 当按下按钮但卡住时,尝试在 UIView.animate 中更改按钮标题和 label.center.x。为什么?斯威夫特 4 Xcode 9.4