实体框架将外键映射到组合键的部分

时间:2015-04-26 15:28:34

标签: c# entity-framework database-design

我的数据库架构在多个不同的表中存储有关某个人的详细信息,其中一些表是文化特定的,有些则不是。每个表使用GUID作为PK,到目前为止它工作得很好。

现在我想在数据库中存储本地化的部分。我目前的思路是用两个属性制作复合键:a)GUID b)项目的文化。 我可以为我的关系使用复合外键,但由于其中一些不是本地化的,这会使我的模型污染不必要的数据。

因此我的问题是:是否可以将外键映射到复合键的某些部分,或者我有错误的想法?在应用程序中,具有相同ID的对象被认为是相同的,只是在不同的语言中,因此我不能简单地给出另一个GUID来将它们存储为不同的对象。

以下是我的代码示例:

这下面的类定义了数据库的主要部分。它被检索,其他一切只是进一步的细节。

[Table("Characters")]
internal class CharacterDataContract
{
    [Key]
    [Column(Order = 0)]
    public Guid Id { get; set; }

    [Key]
    [Column(Order = 1)]
    public string Culture { get; set; }

    public virtual MetadataDataContract Metadata { get; set; }

    public string Name { get; set; }

    // Rest of code left out for brevity
}

这是令我头痛的代码。此表的内容不可本地化,永远不会。如何将元数据类正确链接到Character类,只将ID作为外键?

[Table("Metadata")]
internal class MetadataDataContract
{
    [Key, ForeignKey("Character")]
    public Guid CharacterId { get; set; }

    public CharacterDataContract Character { get; set; }

    // Rest of code left out for brevity
}

我会这样做的另一个原因: 如果我将元数据对象上的ForeignKey链接到Character对象上的完整PrimaryKey,我将在Metadata表中获得数据重复。但是,Metadata对象是CultureInvariant,可以在具有相同CharacterId的任何Character对象上使用,无论角色对象具有何种文化。

0 个答案:

没有答案
相关问题