1

デザイナー(VS2012)を使用してEF5エンティティモデルを作成し、コード生成アイテムとしてEF5DbContextジェネレーターを使用しました。

私のモデルには、別のエンティティ(抽象ではない)から派生したエンティティが含まれています。

したがって、ベースエンティティが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の両方が含まれています。を要求するだけでオブジェクトを取得できます。他のものを取得するために意味のある使用はできないことに注意してください。これにはオブジェクトも含まれます。SchedulingTeamSchedulingTeamSchedulingcontext.Schedulings.OfType<TeamScheduling>()context.Schedulings.OfType<Scheduling>()TeamScheduling

代わりに試すこともできますがcontext.Set<TeamScheduling>()、それがうまくいくかどうかは完全にはわかりません。

于 2013-01-10T10:30:34.370 に答える
2

親のSchedulingエンティティとSchedulingエンティティへの外部キーを持つ子のTeamSchedulingエンティティなど、2つのテーブルを作成する場合は、ここで説明するように、Table-per-Type(TPT)マッピングの使用を検討してください

基本的に、「OnModelCreating」メソッドを次のコードに変更する必要があります。

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

これは、TeamSchedulingサブクラスを独自のテーブルとして表す必要があることをEFに明示的に通知します。LINQを介したクエリは、次のようなことができるので簡単です。

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