ef 核心代码优先泛型继承映射

JMH

所有职位都有一个位置(多对一)。不同的位置类型有不同的位置类型

模型:

public abstract class Location
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int AreaId { get; set; }
    public Area Area { get; set; }
    public byte[] ConcurrencyToken { get; set; }
}
public abstract class Location<T> : Location where T : Position
{
    public ICollection<T> Positions { get; set; } = new List<T>();
}

public class Bay : Location<BayRow> {}
public class StandardLocation : Location<Position> {}

public class Position
{
    public int Id { get; set; }
    public int? Place { get; set; }
    public int LocationId { get; set; }
    public Location Location { get; set; }
    public byte[] ConcurrencyToken { get; set; }
}
public class BayRow : Position
{
    public int? Row { get; set; }
}

以上是缩写,每个都有更多的实现。所有位置都扩展了泛型类。

映射:

modelBuilder.Entity<Position>(entity =>
{                
    entity.ToTable("Position")
          .HasDiscriminator<int>("Type")
          .HasValue<Position>(1)
          .HasValue<BayRow>(2);
    entity.Property(x => x.ConcurrencyToken).IsConcurrencyToken();
    //THIS IS THE ISSUE*
    entity.HasOne(x => x.Location as Location<Position>).WithMany(x => x.Positions).HasForeignKey(x => x.LocationId);
});

modelBuilder.Entity<Location>(entity =>
{
    entity.HasIndex(x => new {x.Name, x.AreaId}).IsUnique(true);
    entity.Property(x => x.ConcurrencyToken).IsConcurrencyToken();
    entity.HasDiscriminator<int>("Type")
          .HasValue<StandardLocation>(1)
          .HasValue<Bay<BayRow>>(2)
});

modelBuilder.Entity<Bay<BayRow>>(entity =>
{
    entity.HasMany(x => x.Positions).WithOne(x => x.Location as Bay<BayRow>)
                .HasForeignKey(x => x.LocationId).OnDelete(DeleteBehavior.Cascade);
});

modelBuilder.Entity<BayRow>(entity =>
{
    entity.Property(x => x.Row).HasColumnName("Row");
});

*非通用位置没有位置

我已经尝试将集合添加到基本位置纯粹用于映射,以避免将每个位置 Impl 即 BayId 复制/别名为 LocationId。

publiic ICollection<Position> Positions { get; set; }

并使用new关键字隐藏基本集合,但 ef 项目 2 个集合...

public new ICollection<T> Positions { get; set; }

任何见解将不胜感激。

约基姆里德尔

我不确定 Entity Framework 是否支持这一点,而不会生成两张表——一张用于 Bay,一张用于 StandardLocation。

您可以尝试将此作为解决方法。

    public interface ITypedPosition<T> where T: Position
    {
        IEnumerable<T> Positions { get; }
    }

    public abstract class Location
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int AreaId { get; set; }
        public Area Area { get; set; }
        public byte[] ConcurrencyToken { get; set; }
        public ICollection<Position> Positions { get; set; }
    }

    public class Bay : Location, ITypedPosition<BayRow>
    {
        IEnumerable<BayRow> ITypedPosition<BayRow>.Positions => base.Positions.OfType<BayRow>();
    }
    public class StandardLocation : Location, ITypedPosition<Position>
    {
        IEnumerable<Position> ITypedPosition<Position>.Positions => base.Positions.OfType<Position>();
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

EF代码优先映射的困惑

来自分类Dev

如何先以EF代码映射继承的实体

来自分类Dev

EF CascadeOnDelete代码优先

来自分类Dev

EF核心代码优先迁移级联删除问题

来自分类Dev

EF生成的代码继承

来自分类Dev

表格未使用EF代码优先方法进行映射

来自分类Dev

EF多模式代码优先

来自分类Dev

EF代码优先与关系的错误

来自分类Dev

EF代码优先,数据库优先

来自分类Dev

如何在EF6代码优先中将泛型类型与数据库上下文一起使用

来自分类Dev

EF核心代码优先Oracle-无法将现有列设置为空

来自分类Dev

EF核心2.2到EF核心3.1

来自分类Dev

EF继承的对象插入由于映射而失败

来自分类Dev

基于继承的实体的EF不同映射

来自分类Dev

多对多关系EF代码优先

来自分类Dev

DDD和EF代码优先迁移

来自分类Dev

EF代码优先通用实体和EntityTypeConfiguration

来自分类Dev

禁用外键约束代码优先EF

来自分类Dev

EF代码优先配置重复记录

来自分类Dev

EF代码优先无效的列名称

来自分类Dev

DDD和EF代码优先迁移

来自分类Dev

存储过程以ef 6和代码优先

来自分类Dev

EF代码优先-自动生成的ID

来自分类Dev

EF代码优先迁移模型构建器

来自分类Dev

EF代码优先Mysql到SQL Server

来自分类Dev

EF代码优先-System.InvalidOperationException

来自分类Dev

将数据库视图映射到带有迁移的EF 5.0代码优先

来自分类Dev

EF6:访问通过代码优先fluent API生成的映射表

来自分类Dev

将数据库视图映射到带有迁移的EF 5.0代码优先