实体框架(CF)将多个表PK转换为相同的FK

时间:2014-02-19 08:36:45

标签: c# entity-framework entity-framework-6

所以我得到了几张这样的表:

    public class Family
{
    public Guid Id { get; set; }
    public virtual Career Career { get; set; }
}

public class Career
{
    public Guid Id { get; set; }
}

还有一些类似的课程。

然后是一张表,根据语言,所有翻译都适用于他们。

public class Language
{
    public string LanguageCulture { get; set; }
    public Guid ObjectId { get; set; }
    public string Translation { get; set; }
}

我的问题在于我希望语言能够理解ObjectId可以来自任何这些类。我怎么能做到这一点?默认情况下,会为每个引用它的表创建一个列。

1 个答案:

答案 0 :(得分:0)

如果你想能够使用LINQ / Lambda的所有优点(并且为了你的关系模型),我建议你不要走这条路。

我要创建一个从Language到每个类的单独链接,或直接从需要它的类链接到LanguageCultureTranslation

我希望实现一个模型,使其尽可能直观地检索和处理数据,即使在构建数据时这可能有点烦人。我非常有信心,你会很高兴你在几个月/几年后建立了真正的关系。

如果你继续你的例子,你会有类似的东西:

var object = _dataset.Where( x=> x.somecolumn == somevalue);
var language = _dataset.Where( x => x.ObjectType == object.Type
                                    && x.ObjectID == object.ID );

而不是简单地做

var object = _dataset.Where( x=> x.somecolumn == somevalue);
object.Language //if you create a separate link to each object
object.LanguageCulture // if you remove your Language object and link directly to what it is your after

在后者中,您只需要获取原始对象,也可以创建子查询,例如

var objects = _dataset.Where( x=> x.somecolumn == somevalue
                                 && x.Language.LanguageCulture.Country == "Sweden")

这个查询仍然可以通过原始想法加入,但一般来说会更烦人。

如果你想避免一遍又一遍地写同样的东西,你可以使用一个抽象类,其中包含你可以在所有需要它的类中继承的语言字段。