EF6 - Mapowanie klucza obcego TPH w klasach pochodnych przy użyciu właściwości klasy bazowej
Używam Entity Framework 6.0.2 z istniejącą bazą danych, w której tagi są przechowywane w pojedynczej tabeli, która wygląda tak:
Id
: int, klucz podstawowyTagType
: string, określ typ tagu „usertag” lub „movietag”ItemId
: int, zawiera identyfikator przedmiotu, do którego się odnosi (identyfikator użytkownika lub identyfikator filmu)Następujące klasy opisują tę sytuację:
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; }
}
Jak widać, moje klasy pochodne mają właściwości nawigacyjne, które są wspierane przez wartośćItemId
właściwość w klasie bazowej. Moje mapowanie wygląda następująco:
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);
}
}
Teraz, gdy próbuję użyć tego odwzorowania przy użyciu następującego kodu, otrzymuję wyjątek:
using System.Data.Entity;
class Program
{
static void Main()
{
using (var db = new Context())
{
db.Database.Delete();
db.Database.Initialize(false);
}
}
}
Wyjątkiem jest:
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
takItemId
właściwość nie jest zadeklarowana na typieUserTag
, ale jest odziedziczony z bazyTag
klasa. Wydaje mi się, że to mapowanie powinno być możliwe. Czy jest to błąd lub ograniczenie w Entity Framework 6?