4

タグが次のような単一のテーブルに格納されている既存のデータベースで Entity Framework 6.0.2 を使用しています。

  • Id: int、主キー
  • TagType: 文字列。タグのタイプを決定します。「usertag」または「movietag」のいずれかです。
  • ItemId: int。参照先のアイテムの ID (ユーザー ID またはムービー ID) が含まれます。

次のクラスは、この状況を説明しています。

public class User
{
    public int Id { get; set; }
}

public class Movie
{
    public int Id { get; set; }
}

public abstract class Tag
{
    public int Id { get; set; }
    public int ItemId { get; set; }
}

public class UserTag : Tag
{
    public virtual User User { get; set; }
}

public class MovieTag : Tag
{
    public virtual Movie Movie { get; set; }
}

ご覧のとおり、派生クラスにはナビゲーション プロパティがありItemId、基本クラスのプロパティの値に基づいています。私のマッピングは次のとおりです。

public class Context : DbContext
{
    public DbSet<Tag> Tags { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Tag>()
            .Map<UserTag>(m => m.Requires("TagType").HasValue("usertag"))
            .Map<MovieTag>(m => m.Requires("TagType").HasValue("movietag"));

        modelBuilder.Entity<UserTag>()
            .HasRequired(m => m.User).WithMany().HasForeignKey(m => m.ItemId);

        modelBuilder.Entity<MovieTag>()
            .HasRequired(m => m.Movie).WithMany().HasForeignKey(m => m.ItemId);
    }
}

次のコードを使用してこのマッピングを使用しようとすると、例外が発生します。

using System.Data.Entity;

class Program
{
    static void Main()
    {
        using (var db = new Context())
        {
            db.Database.Delete();
            db.Database.Initialize(false);
        }
    }
}

スローされる例外は次のとおりです。

Unhandled Exception: System.InvalidOperationException: The foreign key component 'ItemId' is not a declared property on type 'UserTag'. Verify that it has not been explicitly excluded from the model and that it is a valid primitive property

はい、ItemIdプロパティは type で宣言されていませんが、基本クラスUserTagから継承されています。Tag私には、このマッピングが可能であるように思われます。これは Entity Framework 6 のバグまたは制限ですか?

4

1 に答える 1