我正在使用 C#/.net 4.5 和 EF 6 创建一个应用程序,并且想知道是否可以以某种方式执行以下操作:
我有两个基类,例如:
public class BaseItem
{
[Key]
public int Id { get; set; }
public List<BaseRevision> Revisions { get; set; }
}
public class BaseRevision
{
[Key]
public int Id { get; set; }
public BaseItem Item { get; set; }
}
现在我将它们都推导如下:
[Table("ContentItems")]
public class ContentItem : BaseItem
{
public string ContentType { get; set; }
}
[Table("ContentRevisions")]
public class ContentRevision : BaseRevision
{
public string Text { get; set; }
}
这可以正常工作,EF 甚至可以处理以下查询:
var revisions = db.ContentItems.Where(i => i.Revisions.Any(r => (r as ContentRevision).Text.Contians("ABC")));
正如我所期望的那样,这将转换为 SQL,但我想“摆脱as
”(它在其他一些情况下会导致更多的复杂性)。
我尝试使用泛型BaseItem
,但 EF 不支持,所以我尝试了以下方法:
[Table("ContentItems")]
public class ContentItem : BaseItem
{
public string ContentType { get; set; }
public List<ContentRevision> ContentRevisions { get; set; }
}
[Table("ContentRevisions")]
public class ContentRevision : BaseRevision
{
public string Text { get; set; }
public ContentItem ContentItem { get; set; }
}
所以我可以使用上面的查询,如:
var revisions = db.ContentItems.Where(i => i.ContentRevisions.Any(r => r.Text.Contians("ABC")));
但我无法使用“BaseItems”表中继承的外键“Item_Id”让它工作。EF 总是希望使用“ContentItems”表中的新“ContentItem_Id”键创建第二个 FK-Relation,这将复制关系(并可能导致其他一些副作用)。
这是否可能(或者有人有更好的想法来解决/改进这个问题/模式)?
更新:演示项目可以在这里下载。如果您添加一个新的迁移,它将创建我不想要的第二个 FK 映射......