Несколько таблиц БД для одного свойства в модели - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть следующие классы:

public class Customer {
    public virtual int Id {get; set;}
    public virtual string Surname {get; set;}
    public virtual string Prename {get; set;}
    public virtual Location Location {get; set;}
}

public class Location {
    public virtual int Id {get; set;}
    public virtual string ZipCode {get; set;}
    public virtual string Name {get; set;}
}

public class CustomLocation : Location {
}

и следующее сопоставление:

public class CustomerMapping : ClassMapping<Customer> {
    public CustomerMapping(){
        Table("Customer");
        Property(a => a.Surname, b =>
        {
            b.NotNullable(true);
        });
        Property(a => a.Prename, b =>
        {
            b.NotNullable(true);
        });
        ManyToOne(a => a.Location, b =>
        {
            b.Column($"FK_Location_Id");
        });
}}

public class LocationMapping : ClassMapping<Location> {
    public LocationMapping(){
        Table("Location");
        Property(a => a.ZipCode, b =>
        {
            b.NotNullable(true);
        });
        Property(a => a.Name, b =>
        {
            b.NotNullable(true);
        });
}}

public class CustomLocationMapping : ClassMapping<CustomLocation>{
    public CustomLocationMapping(){
        Table("CustomLocation");
        Property(a => a.ZipCode, b =>
        {
            b.NotNullable(true);
        });
        Property(a => a.Name, b =>
        {
            b.NotNullable(true);
        });
}}

Моя цель состоит в том, чтобы у меня была таблица Location, которая обновляется автоматическисценарий и таблица CustomLocation, где пользователь может добавлять местоположения, если они отсутствуют (или за пределами страны).

Моя проблема в том, что я не знаю, как правильно сопоставить это с Customer, что это может быть как Location, так и CustomLocation.

Есть идеи?Заранее спасибо.

1 Ответ

0 голосов
/ 21 февраля 2019

Нельзя сопоставить одно свойство двум столбцам в двух разных таблицах.Как бы NHibernate узнал, какую таблицу использовать?Вы также потеряете ссылочную целостность для этого столбца.

Однако ваша цель может быть достигнута с помощью немного другого подхода: вместо использования двух таблиц для одной и той же структуры, просто используйте одну таблицу Location сследующее представление класса:

public class Location 
{
  public virtual int Id { get; set; }
  public virtual string ZipCode { get; set; }
  public virtual string Name { get; set; }
  public virtual bool IsSystem { get; set; } // just use a boolean column in the table for this one
}

Ваш скрипт может вставлять / обновлять / удалять все строки, где IsSystem == true, и игнорировать остальные.Когда пользователь добавляет запись, просто установите IsSystem = false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...