Можно ли разбить таблицу на классы EF с отношением "один ко многим"?
Структура базы данных
У меня есть очень денормализованная таблица SQL с такой структурой:
CREATE TABLE logistix.shipments
(
shipment_id INT NOT NULL PRIMARY KEY,
destination_id NVARCHAR(15) NOT NULL PRIMARY KEY,
pallet_id INT NOT NULL PRIMARY KEY,
destination_order INT NOT NULL,
pallet_description NVARCHAR(40) NOT NULL
)
Хотя каждая конкретная запись уникальна, одна партия может иметь несколько поддонов, предназначенных для нескольких пунктов назначения.
.NET интерфейс
Это будет управляться объектами EF, которые я хочу структурировать так:
class ShippingContext : DbContext
{
public virtual DbSet<Shipment> Shipments {get; set;}
}
class Shipment
{
int ShipmentId {get; set;}
List<Destination> ShipmentStops {get; set;}
}
class Destination
{
string DestinationId {get; set;}
int DestinationOrder {get; set;}
List<Pallet> Pallets {get; set;}
}
class Pallet
{
int PalletId {get; set;}
string PalletDescription {get; set;}
}
Эта проблема
Несмотря на то, что я нашел учебники по разбиению таблиц на сущности "один к одному" и по сопоставлению данных с внешними ключами в коллекции в EF, я не могу найти ничего о сопоставлении столбцов из одной таблицы в коллекции. Возможно ли это, или я ограничен разделением таблицы, созданием представлений или созданием класса POCO со свойством для каждого столбца?
Endmatter
Другое приложение получит доступ к таблице SQL, чтобы сгенерировать отчеты по произвольному количеству поставок, поэтому Powers That Be решил использовать денормализованную таблицу для повышения производительности, а не набор нормализованных таблиц и представление, для извлечения которых потребуется больше времени.
1 ответ
Ваши классы должны выглядеть как-то по этой ссылке
public class ShipmnetContext : DbContext
{
public DbSet<Shipment> Shipments { get; set; }
public DbSet<Destination> Destinations { get; set; }
public DbSet<Pallet> Pallets { get; set; }
}
public class Shipment
{
public int ShipmentId { get; set; }
public ICollection<Destination> ShipmentStops { get; set; }
public Shipment()
{
ShipmentStops = new HashSet<Destination>();
}
}
public class Destination
{
[Key]
public string DestinationId { get; set; }
public int DestinationOrder { get; set; }
//[Required]
public Shipment Shipment { get; set; } //Foreign key to Shipment table, make property NotNull by adding [Required] attribute
public ICollection<Pallet> Pallets { get; set; }
public Destination()
{
Pallets = new HashSet<Pallet>();
}
}
public class Pallet
{
public int PalletId { get; set; }
public string PalletDescription { get; set; }
public Destination Destination { get; set; } //Foreign key to Destination table
}