Страницы

Поиск по вопросам

вторник, 16 июля 2019 г.

Пользовательские типы в классе сущности на Entity Freamework 6

При написании DAL в .NET приложении было принято решение об использовании CodeFirst-подхода EF6. Имеется класс сущности - клиент:
public class Client { public int ClientId { get; set; } //PK //... //address properties: public string City { get; set; } public string Street { get; set; } public string House { get; set; } public string Flat { get; set; } //... }
С точки зрения ОО-подхода, имеет смысл инкапсулировать свойства, относящиеся к адресу проживания объекта в отдельный класс для удобства обращения к самому объекту в коде, тогда код примет следующий вид:
public class Client { public int ClientId { get; set; } //PK //... public int AddressId { get; set; } public Address Address { get; set; } //... }
public class Address { public int AddressId { get; set; } //PK
public string City { get; set; } public string Street { get; set; } public string House { get; set; } public string Flat { get; set; } }
И вроде бы всё хорошо, но нужно хранить в самой БД поля со значением адреса как обычные столбцы для каждого клиента в таблице, содержащей данные о клиенте, а не выделять под адреса отдельную таблицу. Но вместе с тем, в самом коде хотелось бы инкапсулировать поля в отдельный класс. Можно ли это сделать при помощи Fluent API или DA? И можно ли вообще? Спасибо.


Ответ

Достаточно просто не выделять адрес в отдельную сущность. Модель вида:
public class Client { [Key] public int ClientId { get; set; }
public Address Address { get; set; } }
public class Address { public string City { get; set; } public string Street { get; set; } public string House { get; set; } public string Flat { get; set; } }
при контексте
public class Model1 : DbContext { public Model1() : base("name=Model1") { }
public DbSet Clients { get; set; } }
сгенерирует одну таблицу:
CREATE TABLE [dbo].[Clients]( [ClientId] [int] IDENTITY(1,1) NOT NULL, [Address_City] [nvarchar](max) NULL, [Address_Street] [nvarchar](max) NULL, [Address_House] [nvarchar](max) NULL, [Address_Flat] [nvarchar](max) NULL, CONSTRAINT [PK_dbo.Clients] PRIMARY KEY CLUSTERED ( [ClientId] ASC ) )

Комментариев нет:

Отправить комментарий