Следующее руководство предназначено для Entity Framework , , а не EF Core . Это все еще актуальное руководство для. Net реализаций Framework.
Функция EF, о которой вы здесь говорите, облегчается благодаря использованию Сложных типов .
- Сложный тип не имеет ключей и поэтому не может существовать независимо.
- Он может существовать только как свойства типов сущностей или других сложных типов.
- Это не может участвовать в ассоциациях и не может содержать свойства навигации.
- Свойства сложного типа не могут быть нулевыми.
- Скалярные свойства сложных объектов могут быть нулевыми.
Отметив RoomLocation
как сложный тип , EF не будет создавать или сопоставлять отдельную таблицу в базе данных, а вместо этого будет сопоставлять поля в таблице для типа, который содержит свойство для сложного типа. .
Это можно сделать с помощью Fluent API или Аннотации данных , однако, поскольку вы используете KeyAttribute
, этот пример позволяет продолжить с Dat a Аннотации (иначе известные как Атрибут Обозначение)
Поэтому сделайте RoomLocation
сложным типом:
[ComplexType]
public class RoomLocation
{
public int Floor { get; set; }
public int Building { get; set; }
public int Room { get; set; }
}
Соглашение о присвоении имен по умолчанию для полей базы данных означает следующее для этой таблицы будет использовано отображение полей базы данных по умолчанию:
ПРИМЕЧАНИЕ: это MS SQL Синтаксис сервера, аналогичные типы будут использоваться в Postgres, имена полей здесь важны для этого обсуждения.
Id UniqueIdentifier NOT NULL,
Title NVarChar(MAX),
Location_Floor INT NOT NULL,
Location_Building INT NOT NULL,
Location_Room INT NOT NULL,
CreationDate DateTime2 NOT NULL
ModificationDate DateTime2 NOT NULL
Вы можете использовать соглашения или задавать c отображение через Fluent API для сопоставления этих полей с различными именованными полями.
ПРИМЕЧАНИЕ: Если регистр полей несколько отличается (Caml, нижний или верхний регистр), EF все равно разрешит это отображение и все равно будет работать против Postgres поля базы данных, которые все в нижнем регистре, как ваш пример
item.Location.Floor -> location_floor,
item.Location.Building -> location_building,
item.Location.Room -> location_room