我将 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 中的错误还是限制?