我的数据库架构在多个不同的表中存储有关某个人的详细信息,其中一些表是文化特定的,有些则不是。每个表使用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对象上使用,无论角色对象具有何种文化。