gpt4 book ai didi

c# - 重新使用继承的 FK 关系?

转载 作者:太空宇宙 更新时间:2023-11-03 13:36:20 25 4
gpt4 key购买 nike

我正在使用 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 关系,这会复制关系(并可能导致其他一些副作用)。

这是否有可能(或者有人有更好的主意来解决/改进这个问题/模式)?

更新:可以下载演示项目HERE .如果您添加新的迁移,它将创建我不想要的第二个 FK 映射...

最佳答案

编辑:

您不需要在此处添加复杂的关系,这正是 OfType<> 的用途。

当您只想访问您的 ContentItems 时,而不是在您继承的对象中创建一个新列表,您可以使用 BaseItem 列表并编写:

(i is a BaseItem)
i.Revison.OfType<ContentItem>

您将使用这个公共(public)列表来存储所有不同的 BaseItems。感谢编译器,它没有开发人员错误,因为在使用 OfType<> 函数时,您只会获得所需的类型化对象。

初始答案:如果您最初的问题是所有修订都不是 ContentRevision 并且它导致您的查询在 as 转换时失败,您应该这样写:

var revisions = db.ContentItems.Where(i => i.Revisions.OfType<ContentRevision>.Any(r => r.Text.Contains("ABC")));

关于c# - 重新使用继承的 FK 关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18616425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com