Как узнать, принадлежит ли ClrType в EF Core? - PullRequest
0 голосов
/ 02 мая 2020

Я использую DbContext.Model.GetEntityTypes() для проверки типов в моей схеме БД. Как я могу узнать, что IEntityType не принадлежит (то есть имеет собственную таблицу SQL). В моем DbContext я буду указывать принадлежащее свойство либо с помощью атрибутов, либо с помощью Fluent API.

1 Ответ

3 голосов
/ 04 мая 2020

Как я могу узнать, что IEntityType не принадлежит (то есть имеет собственную таблицу SQL)

Здесь на самом деле есть два вопроса.

Первый -

Как узнать, что IEntityType не принадлежит

Это просто - вы используете IsOwned метод расширения. Итак, учитывая IEntityType entityType:

bool isOwned = entityType.IsOwned();

Второй -

Как узнать, есть ли у IEntityType собственная SQL таблица

Этот более сложный, потому что того, что тип объекта является владельцем, недостаточно, чтобы сказать это.

Во-первых, разбиение таблицы (т. Е. Поддерживается разделение таблицы между 2 или более объектами) только для личных отношений. Однако EF Core поддерживает также наборы собственных типов , которые являются отношением один-ко-многим и отображаются в отдельную таблицу.

Вы можете определить, является ли тип объекта reference принадлежащий тип (т. Е. Не принадлежащий коллекции тип) с кодом, подобным следующему:

var ownership = entityType.FindOwnership();
bool isReferenceOwned = ownership != null && ownership.IsUnique;

Во-вторых, даже если по умолчанию ссылочные типы-владельцы сопоставляются с той же таблицей, что и владелец, их можно настроить на использование их собственный стол. Они могут быть исключены следующим образом (EF Core 3.x):

var ownership = entityType.FindOwnership();
bool isSharedOwned = ownership != null && ownership.IsUnique &&
    ownership.PrincipalEntityType.GetTableName() == entityType.GetTableName();

В-третьих, даже если по умолчанию обычные типы отображаются в отдельную таблицу, их можно настроить на использование разделения таблицы. Поэтому вам необходимо учитывать это.

Наконец, существует также наследование базы данных , указанное в свойстве BaseType . В настоящее время EF Core (3.x) поддерживает только EF Core шаблон таблицы на иерархию (TPH), поэтому только GetRootType может иметь собственную таблицу, но в будущем (5.x?) EF Core будет поддержка таблицы для каждого типа (TPT), поэтому все это также необходимо учитывать.

В общем, довольно сложно определить, какой тип сущности имеет собственную таблицу, или, более конкретно, какое имя таблицы сущностей вы называете предполагается настроить "по пользовательскому соглашению", если это фактический вопрос позади. Вам необходимо проверить все вышеперечисленные условия и реагировать соответствующим образом. Но если вы не используете ничего из этого, !entityType.IsOwned() будет достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...