При написании 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
сгенерирует одну таблицу:
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
)
)
Комментариев нет:
Отправить комментарий