1

我正在使用设计器(VS2012)创建一个 EF5 实体模型,并将 EF5 DbContext 生成器用作代码生成项。

我的模型包含一个派生自另一个(非抽象)的实体。

因此,假设基础实体称为 BaseEntity,派生实体称为 DerivedEntity。

现在我在生成的上下文类中看到,没有

Public DbSet<DerivedEntity> DerivedEntities { get; set; }

定义。

仅有的

Public DbSet<BaseEntity> BaseEntities { get; set; }

被定义为。

这是正常的吗?如果是,我如何查询 linq 中的派生实体?

我习惯这样查询:

using(var ctx = new EntityContainer)
{
var q = from e in ctx.DerivedEntities <-- but this is now not possible since it doesn't exist
select e;

return q.ToList();
}

感谢回复。

编辑:

根据要求,生成的类发布:

实体模型设计器图(子集)

public partial class Scheduling
    {
        public int Id { get; set; }
        public string Subject { get; set; }
        public System.DateTime BeginDate { get; set; }
        public System.DateTime EndDate { get; set; }
    }

public partial class TeamScheduling : Scheduling
    {
        public int TeamId { get; set; }
        public Nullable<int> AssignmentId { get; set; }

        public virtual Team Team { get; set; }
        public virtual Assignment Assignment { get; set; }
    }


public partial class EntityContainer : DbContext
    {
        public EntityContainer()
            : base("name=EntityContainer")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }

        public DbSet<Team> Teams { get; set; }
        public DbSet<Location> Locations { get; set; }
        public DbSet<Country> Countries { get; set; }
        public DbSet<Assignment> Assignments { get; set; }
        public DbSet<ProductType> ProductTypes { get; set; }
        public DbSet<AssignmentPreference> AssignmentPreferences { get; set; }
        public DbSet<Scheduling> Schedulings { get; set; }
    }

如您所见,EntityContainer 类不包含

public DbSet<TeamScheduling> TeamSchedulings { get; set; }
4

2 回答 2

2

当您按照自己的方式使用继承时,这是预期的。context.Schedulings包含Scheduling对象和TeamScheduling对象。您TeamScheduling只能通过请求获得对象context.Schedulings.OfType<TeamScheduling>()。请注意,您不能有意义地使用context.Schedulings.OfType<Scheduling>()来获取其他对象:这也将包括TeamScheduling对象。

您也可以尝试context.Set<TeamScheduling>(),但我不完全确定这会奏效。

于 2013-01-10T10:30:34.370 回答
2

如果您的意图是创建两个表,例如父调度实体和子 TeamScheduling 实体,它们具有返回调度实体的外键,请考虑使用此处讨论的 Table-per-Type (TPT) 映射。

本质上,您应该修改“OnModelCreating”方法以具有以下代码:

modelBuilder.Entity<TeamScheduling>().ToTable("TeamScheduling");

这明确告诉 EF 您希望将 TeamScheduling 子类表示为它自己的表。通过 LINQ 查询它会很简单,因为您可以执行以下操作:

var teamScheds = context.Set<TeamScheduling>().Where(s => s.Id == 1).FirstOrDefault();
于 2013-01-10T11:54:07.397 回答