将引用属性字段映射到与根类相同的表

Posted

技术标签:

【中文标题】将引用属性字段映射到与根类相同的表【英文标题】:Map reference property fields to the same table as root class 【发布时间】:2017-04-05 09:28:52 【问题描述】:

我有具有参考属性的模型

internal class AstronomycalBody : IAstronomycalBody

    public long Id  get; set; 

    public string Name  get; set; 

    public Coord Coord  get; set; 

    public long Mass  get; set; 

    public double Speed  get; set; 

    public IAstronomycalBody CentralObject  get; set; 


public class Coord

    public long X  get; set; 

    public long Y  get; set; 

    public long Z  get; set; 

我想像这样使用映射

internal class AstronomycalBodyContext : DbContext

    public DbSet<AstronomycalBody> AstronomycalBody  get; set; 

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    
        optionsBuilder.UseSqlite(DbSettings.ConnectionString);
    

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    
        modelBuilder.Entity<AstronomycalBody>().Property(p => p.Coord.X).ForSqliteHasColumnName("CoordX");
        modelBuilder.Entity<AstronomycalBody>().Property(p => p.Coord.Y).ForSqliteHasColumnName("CoordY");
        modelBuilder.Entity<AstronomycalBody>().Property(p => p.Coord.Z).ForSqliteHasColumnName("CoordZ");
        modelBuilder.Entity<AstronomycalBody>().Property(p => p.CentralObject.Id).ForSqliteHasColumnName("CentralObjectId");
    

将模型映射到此表上:

目前,编译器正在抛出这个异常...

【问题讨论】:

【参考方案1】:

您的 AstronomycalBody 不是有效的 EF 实体模型类。

首先,EF Core does not support Complex/value types yet,所以Coord 成员应该就地展开。

其次,EF 不适用于interfaces,因此每个导航引用/集合元素类型都应该是实体class

话虽如此,但不确定您的IAstronomycalBody 是什么样子以及如何实现它(您可能需要显式 实现某些成员),但实体类应该是这样的:

internal class AstronomycalBody //: IAstronomycalBody

    public long Id  get; set; 
    public string Name  get; set; 
    //public Coord Coord  get; set; 
    public long CoordX  get; set; 
    public long CoordY  get; set; 
    public long CoordZ  get; set; 
    public long Mass  get; set; 
    public double Speed  get; set; 
    public AstronomycalBody CentralObject  get; set; 

现在,按照惯例,它会生成显示的确切表格,只需删除 OnModelCreating 中显示的所有行即可。

【讨论】:

以上是关于将引用属性字段映射到与根类相同的表的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 将查询结果附加到具有必填字段的表中

Eloquent 将 API 属性映射到字段名称

Doctrine2 Mapping:2 个字段映射到一个字段(ManyToOne)

mybitis中对象字段与表中字段名称不匹配(复制)

7.属性名与查询字段名不相同

MyBatis应用开发(12)映射之结果映射resultMap