タグが次のような単一のテーブルに格納されている既存のデータベースで 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 のバグまたは制限ですか?