Сохранение композитного объекта в базе

177
31 марта 2018, 13:25

В домене приложения есть объект/entity Place (Место) и есть у него среди других value object'ов – координаты на яндекс:карте (x,y и zoom карты):

public class Place
{
    public int Id { get; set; }
    public string Title { get; set; }
    public YandexMapPoint Point { get; set; }
}
public class YandexMapPoint
{
    public float X { get; set; }
    public float Y { get; set; }
    public byte Zoom { get; set; }
}

При этом я хочу, чтобы в базе это хранилось в одной таблице с полями Id, Title, x, y, zoom – и при чтении из базы разворачивалось обратно в доменный объект. А при сохранении доменного объекта – наоборот, складировалось в одну таблицу.

Я использую EF (EF6 или Core, не принципиально) Code First.

Как мне описать подобную структуру на уровне работы с базой данных?

Answer 1

Конечно, это возможно. Создавая новый проект, я думал, придётся либо с атрибутами помудрить, либо флюэнт-интерфейс заюзать.

Но для начала я создал заготовку следующего вида:

using System;
using System.Data.Entity;
using System.Linq;
namespace ConAppEF
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var context = new MyContext())
            {
                Console.WriteLine(context.Places.Count());
            }
        }
    }
    public class MyContext : DbContext
    {
        public DbSet<Place> Places { get; set; }
    }
    public class Place
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public YandexMapPoint Point { get; set; }
    }
    public class YandexMapPoint
    {
        public float X { get; set; }
        public float Y { get; set; }
        public byte Zoom { get; set; }
    }
}

После запуска было создана БД с такой таблицей:

CREATE TABLE [dbo].[Places] (
    [Id]         INT            IDENTITY (1, 1) NOT NULL,
    [Title]      NVARCHAR (MAX) NULL,
    [Point_X]    REAL           NOT NULL,
    [Point_Y]    REAL           NOT NULL,
    [Point_Zoom] TINYINT        NOT NULL,
    CONSTRAINT [PK_dbo.Places] PRIMARY KEY CLUSTERED ([Id] ASC)
);

Даже не пришлось ничего делать.

READ ALSO
Изменить прямоугольник фокуса на MenuItem

Изменить прямоугольник фокуса на MenuItem

Когда наводим мышкой на MenuItem на нем рисуется прямоугольник фокуса, как изменить его цвет фона и цвет рамки, шаблон? Не нашел в шаблоне MenuItem...

195
Не задается значение default для ComboBox

Не задается значение default для ComboBox

Есть ComboBox с двумя параметрамиТребуется чтобы в нем по default уже стояло одно из значений

200
Не получается установить TLS соединение

Не получается установить TLS соединение

Собственно, не удается установить защищенное соединение с сайтом, пробовал обычный webrequest, xnet, chilkat - ничего не помогает, зато запрос в браузере...

274
Конвертация JS COM обьекта в С#

Конвертация JS COM обьекта в С#

Как можно обьект из JavaScript преобразовать в похожий на С#? Как сделать EnumerateProperties для COM?

153