将引用属性字段映射到与根类相同的表
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
中显示的所有行即可。
【讨论】:
以上是关于将引用属性字段映射到与根类相同的表的主要内容,如果未能解决你的问题,请参考以下文章