首页 > 解决方案 > 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 文件?

标签: c#.netentity-frameworkasp.net-core

解决方案


对于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);
            });
    }

推荐阅读