【问题标题】:Two database-tables for one model一个模型的两个数据库表
【发布时间】:2019-03-29 18:08:40
【问题描述】:

我正在使用现有的 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; }

所以我创建了一个包含上述定义的“地址”类。 然后我创建了 2 个继承“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();
    }
}

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

【问题讨论】:

  • 如果两个表结构完全相同,我想知道为什么不为它们使用同一个表,并带有确定文化/语言的附加字段。
  • @HagayGoshen 正如我所说,它是一个现有的数据库。其他应用程序使用相同的数据库。我不允许对数据库进行更改。
  • 如果你想要一个“更干净”的代码解决方案,你需要清理你的数据库端。如果你不能改变你的数据库结构,你可以添加一个存储过程来接收文化/语言 id 并从正确的表中返回数据,但是你将你的 if 条件从你的应用程序移动到你的数据库。

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


【解决方案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 & fluent 描述。我不确定,但我认为引用 CompanyAddress 会导致加载相应的地址。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-27
    • 2011-06-13
    • 1970-01-01
    • 2013-03-24
    • 2014-08-31
    • 2018-03-03
    • 2015-10-06
    • 1970-01-01
    相关资源
    最近更新 更多