EF5 Model-First,DBContext代码生成和派生类

时间:2013-01-10 09:56:16

标签: c# entity-framework

我正在使用设计器(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();
}

感谢您的回复。

修改

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

Entity Model Designer diagram (subset)

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

2 个答案:

答案 0 :(得分:2)

当您以自己的方式使用继承时,这是预期的。 context.Schedulings包含Scheduling个对象和TeamScheduling个对象。您只能通过询问TeamScheduling来获取context.Schedulings.OfType<TeamScheduling>()个对象。请注意,您无法有意义地使用context.Schedulings.OfType<Scheduling>()来获取其他内容:还会包含TeamScheduling个对象。

您也可以尝试context.Set<TeamScheduling>(),但我不完全确定它会起作用。

答案 1 :(得分:2)

如果你想要有两个表,比如父调度实体以及将外键返回Scheduling实体的子TeamScheduling实体,请考虑使用每个类型的表(TPT)映射讨论了here

实质上,您应该修改“OnModelCreating”方法以获得以下代码:

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

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

var teamScheds = context.Set<TeamScheduling>().Where(s => s.Id == 1).FirstOrDefault();