Две базы данных-таблицы для одной модели - PullRequest
0 голосов
/ 25 октября 2018

Я работаю с существующей базой данных 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_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();
    }
}

Мне было интересно, существует лилучший способ решения этой проблемы.

1 Ответ

0 голосов
/ 26 октября 2018

Только для того, чтобы вы не создавали «магические числа», т.е. 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();
    }
}

Вы также можете быть хитрыми (любить быть плохим) и иметь средство получения / установки свойств, которое использует свойства виртуальной навигации для возврата «правильного» адреса с учетом текущей культуры и первичногоключ (НДС - это 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 приведет к загрузке соответствующего адреса.

...