一个模型有两个数据库表

时间:2018-10-25 07:48:26

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

我正在使用现有的sqlserver数据库。 在该数据库中,有两个包含“地址信息”的表。 一个表以法语显示信息,另一个表以荷兰语显示。 两个表的布局相同。

[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; }

因此,我创建了一个包含以上定义的“ Addresse”类。 然后,我创建了两个继承“ Addresse”的类“ Addresse_FR”和“ Addresse_NL”。

在我的存储库中,我创建了以下方法:

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();
    }
}

我想知道是否有更好的方法来解决这个问题。

1 个答案:

答案 0 :(得分:1)

请不要创建“魔术数字”,即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();
    }
}

您还可能会遇到棘手的问题(喜欢做得不好),并拥有一个使用虚拟导航属性返回当前“地址”和主键的“正确”地址的Property Getter / Setter(我猜增值税是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将导致加载相应的地址。