EntityFramework: возможно ли отобразить два разных столбца в одну и ту же сущность / модель, которая соответствует одной и той же практике? - PullRequest
2 голосов
/ 16 октября 2019

Я создаю приложение, которое берет данные из существующей таблицы, а затем разбивает их на несколько объектов, которые следуют определенным тенденциям. Это для агента по сдаче в аренду, который управляет несколькими различными агентствами. Одна из таких общих сущностей, которую я определила, - это Адрес, совместно используемый Арендодателем, Агентом по аренде и фактическим свойством, которые имеют свойства, указанные ниже:

public class Address 
    {
        public string HouseNumber
        public string FlatPosition
        public string AddressLine
        public string Town
        public string County
        public string Postcode
    }

В гигантской таблице они следуют приведенной выше схеме,но указываются с соответствующим существительным впереди, например, "LandlordHouseNumber и т. д., PropertyHouseNumber и т. д., LettingAgentHouseNumber и т. д."

Можно ли взять данные из таблицы и создать экземпляр класса адреса, пока он можетвыделить сущность, которую они представляют? Или мне понадобится адресный класс для каждого?

РЕДАКТИРОВАТЬ:

Table heading structure

Ответы [ 3 ]

0 голосов
/ 17 октября 2019

1. Свернуть в базе данных

Вы можете создать представление или создать запрос, который сворачивает эти 3x столбцы в один разумный столбец.

2. Сгиб при извлечении

2a Linq-to-sql


//Model
public class Address 
    {
        public string AHouseNumber 
        public string BHouseNumber 
        public string CHouseNumber 
(...)

Вы можете сделать простой конкат:

await db.Addresses
  .Select( a=> new { Address = AHouseNumber + BHouseNumber + CHouseNumber } )
  .ToListAsync(); 

2b. Запустить пользовательский запрос

0 голосов
/ 17 октября 2019

Как и предполагалось, вам нужно определить Complex Type для адреса, а затем сопоставить свойства с соответствующими столбцами.

public class Address 
{
    public string HouseNumber { get; set; }
    public string FlatPosition { get; set; }
    public string AddressLine { get; set; }
    public string Town { get; set; }
    public string County { get; set; }
    public string Postcode { get; set; }
}

public YourEntity
{
    public int Id { get; set; } // or whatever you use
    // other properties

    // complex type properites
    public Address LandlordAddress { get; set; }
    public Address LandlordAgentAddress { get; set; }
}

Затем настроить в DbContext:

protected void OnModelCreating( DbModelBuilder modelBuilder )
{
    // configure like an entity but use .ComplexType<>()
    modelBuilder.ComplexType<Address>()
        // e.g. set max size of one of the properties
        .Property( a => a.Postcode )
        .HasMaxLength( 10 );
    // etc.

    // map properties to columns if you don't want to use default naming convention
    modelBuilder.Entity<YourEntityType>()
        .Property( yet => yet.LandlordAddress.Postcode )
        .HasColumnName( "LandlordPostcode" );

    modelBuilder.Entity<YourEntityType>()
        .Property( yet => yet.LandordAgentAddress.Postcode )
        .HasColumnName( "LandlordAgentPostcode" );
}
0 голосов
/ 16 октября 2019

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

public interface IAddress
{
    string HouseNumber { get; set; }
    string FlatPosition { get; set; }
    string AddressLine { get; set; }
    string Town { get; set; }
    string County { get; set; }
    string Postcode { get; set; }
}

Затем добавьте свои классы моделей следующим образом:

public class LandLordAddress : IAddress
{
    [Column("LandLordHouseNumber")]
    public string HouseNumber { get; set; }
    ...
}

Таким образом, вы по крайней мереуметь писать более общий код для работы с экземплярами этих классов.

...