一个模型的两个数据库表
Two database-tables for one model
我正在使用现有的 sqlserver 数据库。
在这个数据库中有两个 table 包含 "address-information"。
一个 table 的信息是法语的,另一个是荷兰语的。
两个 table 具有相同的布局。
[Key]
[Column("fu_VAT")]
public int VatNumber { get; set; }
[Column("fu_EindDatum")]
public int EindDatum { get; set; }
[Column("fu_vorm")]
public string Vorm { get; set; }
[Column("fu_NameOrigin")]
public int NameOrigin { get; set; }
[Column("fu_AdresOrigin")]
public int AdresOrigin { get; set; }
[Column("fu_Name")]
public string Name { get; set; }
[Column("fu_StraatNaam")]
public string StraatNaam { get; set; }
所以我创建了一个包含上述定义的 class "Addresse"。
然后我创建了 2 classes "Addresse_FR" 和 "Addresse_NL" 继承 "Addresse".
在我的存储库中,我创建了以下方法:
public Addresse GetCompanyAddressByLanguageAndVatNumber(int VatNumber, int Language)
{
switch (Language)
{
case 1: //Frans
return xmlALaCarteContext.CWFirmaAddresseFr.Where(a => a.VatNumber == VatNumber).SingleOrDefault().ToAddresse();
default:
return xmlALaCarteContext.CWFirmaAddresseNl.Where(a => a.VatNumber == VatNumber).SingleOrDefault().ToAddresse();
}
}
我想知道是否有更好的方法来解决这个问题。
只是为了不创建 "Magic numbers",即 1 = 法语等。为什么不使用 CultureInfo.Name?当然,无论位置如何,您都可以坚持使用前两个字符作为语言。仅法语我就找到了 6 个。这些值是 ISO 标准。
// Language contains CultureInfo.Name (iso name that aligns to country/language)
public Addresse GetCompanyAddressByLanguageAndVatNumber(int VatNumber, string Language)
{
switch (Language)
{
case "fr-CA": //Canadian French
case "fr-FR": //France French
return xmlALaCarteContext.CWFirmaAddresseFr.Where(a => a.VatNumber == VatNumber).SingleOrDefault().ToAddresse();
case "nl-NL": //Netherlands Dutch
return xmlALaCarteContext.CWFirmaAddresseFr.Where(a => a.VatNumber == VatNumber).SingleOrDefault().ToAddresse();
default:
throw new NotImplementedException();
}
}
你也可以变得狡猾(爱是坏的)并且有一个 属性 Getter/Setter 使用虚拟导航属性到 return 给定当前文化的 "right" 地址和主键(我认为增值税是 FK?)
public class myParent
{
[Key]
public int Id { get; set; }
// navigation properties
public int VatNumber { get; set; }
private virtual Addresse FrenchAddress { get; set; }
private virtual Addresse DutchAddress { get; set; }
public Addresse CompanyAddress {
get {
switch (System.Globalization.CultureInfo.Name)
{
case "fr-CA": //Canadian French
case "fr-FR": //France French
return FrenchAddress;
case "nl-NL": //Netherlands Dutch
return DutchAddress;
default:
throw new NotImplementedException();
}
set;
}
}
}
具有相应的 Setter 和流畅的描述。我不确定,但我认为引用 CompanyAddress 会导致加载相应的地址。
我正在使用现有的 sqlserver 数据库。 在这个数据库中有两个 table 包含 "address-information"。 一个 table 的信息是法语的,另一个是荷兰语的。 两个 table 具有相同的布局。
[Key]
[Column("fu_VAT")]
public int VatNumber { get; set; }
[Column("fu_EindDatum")]
public int EindDatum { get; set; }
[Column("fu_vorm")]
public string Vorm { get; set; }
[Column("fu_NameOrigin")]
public int NameOrigin { get; set; }
[Column("fu_AdresOrigin")]
public int AdresOrigin { get; set; }
[Column("fu_Name")]
public string Name { get; set; }
[Column("fu_StraatNaam")]
public string StraatNaam { get; set; }
所以我创建了一个包含上述定义的 class "Addresse"。 然后我创建了 2 classes "Addresse_FR" 和 "Addresse_NL" 继承 "Addresse".
在我的存储库中,我创建了以下方法:
public Addresse GetCompanyAddressByLanguageAndVatNumber(int VatNumber, int Language)
{
switch (Language)
{
case 1: //Frans
return xmlALaCarteContext.CWFirmaAddresseFr.Where(a => a.VatNumber == VatNumber).SingleOrDefault().ToAddresse();
default:
return xmlALaCarteContext.CWFirmaAddresseNl.Where(a => a.VatNumber == VatNumber).SingleOrDefault().ToAddresse();
}
}
我想知道是否有更好的方法来解决这个问题。
只是为了不创建 "Magic numbers",即 1 = 法语等。为什么不使用 CultureInfo.Name?当然,无论位置如何,您都可以坚持使用前两个字符作为语言。仅法语我就找到了 6 个。这些值是 ISO 标准。
// Language contains CultureInfo.Name (iso name that aligns to country/language)
public Addresse GetCompanyAddressByLanguageAndVatNumber(int VatNumber, string Language)
{
switch (Language)
{
case "fr-CA": //Canadian French
case "fr-FR": //France French
return xmlALaCarteContext.CWFirmaAddresseFr.Where(a => a.VatNumber == VatNumber).SingleOrDefault().ToAddresse();
case "nl-NL": //Netherlands Dutch
return xmlALaCarteContext.CWFirmaAddresseFr.Where(a => a.VatNumber == VatNumber).SingleOrDefault().ToAddresse();
default:
throw new NotImplementedException();
}
}
你也可以变得狡猾(爱是坏的)并且有一个 属性 Getter/Setter 使用虚拟导航属性到 return 给定当前文化的 "right" 地址和主键(我认为增值税是 FK?)
public class myParent
{
[Key]
public int Id { get; set; }
// navigation properties
public int VatNumber { get; set; }
private virtual Addresse FrenchAddress { get; set; }
private virtual Addresse DutchAddress { get; set; }
public Addresse CompanyAddress {
get {
switch (System.Globalization.CultureInfo.Name)
{
case "fr-CA": //Canadian French
case "fr-FR": //France French
return FrenchAddress;
case "nl-NL": //Netherlands Dutch
return DutchAddress;
default:
throw new NotImplementedException();
}
set;
}
}
}
具有相应的 Setter 和流畅的描述。我不确定,但我认为引用 CompanyAddress 会导致加载相应的地址。