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

时间:2017-04-05 09:28:52

标签: sqlite mapping code-first entity-framework-core

我有带参考属性的模型

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");
    }
}

在此表上映射模型:

AstronomycalBody Table

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

enter image description here

1 个答案:

答案 0 :(得分:2)

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

首先,EF Core does not support Complex/value types yet,因此IAstronomycalBody成员应该扩展到位。

其次,EF不能与 interfaces 一起使用,因此每个导航参考/集合元素类型都应该是实体 class

话虽如此,不确定你的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

现在,按照惯例,它会生成所显示的确切表格,只需删除def get_lines(path): for line in csv.reader(open(path), delimiter=";"): if line: yield line else: break f = [i for i in get_lines("blah.csv")] print f 中显示的所有行,即可完成。