Moses_k Ответов: 2

Отслеживание изменений в entity framework для таблиц идентификаторов


Привет,
Как я могу регистрировать таблицы идентификаторов?
Я зарегистрировал все таблицы, но для идентификации у таблиц есть некоторые проблемы.
Я не мог войти в него; в процессе отслеживания изменений он выдает ошибку о первичный ключ

public class ApplicationRoleMetaData : IdentityRole<int, ApplicationUserRoleMetaData>

Я унаследовал от него
IdentityRole


Мой вопрос заключается в том, как я мог бы решить эту ошибку.

Что я уже пробовал:

Я реализовал журнал для таблиц, но он выдает ошибку в первичных ключах в таблице.

Редактировать: От комментариев:
это сообщение об ошибке
Sequence contains no matching element
эта строка вызвала отмеченную ошибку
string keyName = dbEntry.Entity.GetType().GetProperties().Single(p => p.GetCustomAttributes(typeof(KeyAttribute), false).Count() > 0).Name;

Richard MacCutchan

- он выдает ошибку"
Это одно из самых бесполезных сообщений, которые мы видим здесь. Мы понятия не имеем, что делает ваш код, что такое сообщение об ошибке или какие другие проблемы вы можете видеть.

Moses_k

это сообщение об ошибке => последовательность не содержит соответствующего элемента

эта строка вызвала отмеченную ошибку =>
строка keyName = dbEntry.Сущность.Метод gettype().Метод getproperties().Один(п =&ГТ; п.GetCustomAttributes(для вызова typeof(KeyAttribute), ложные).Count() > 0).имя;

2 Ответов

Рейтинг:
8

Richard Deeming

Свойства первичного ключа не обязательно имеют [Key] примененный атрибут. Они могут быть настроены с помощью fluent API или по соглашению.

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

Извлечение свойств первичного ключа довольно просто:

Структура Сущностей 6:

private static IReadOnlyList<string> GetPrimaryKeyProperties(this IObjectContextAdapter context, Type entityType)
{
    if (!context.ObjectContext.MetadataWorkspace.TryGetItem(entityType.FullName, DataSpace.OSpace, out EntityType dataType)) return Array.Empty<string>();
    return dataType.KeyProperties.Select(p => p.Name).ToList();
}

public static IReadOnlyDictionary<string, DbPropertyEntry> ExtractPrimaryKey<TEntity>(this DbContext context, DbEntityEntry<TEntity> entry) where TEntity : class
{
    var result = new Dictionary<string, DbPropertyEntry>(StringComparison.Ordinal);
    foreach (string name in context.GetPrimaryKeyProperties(typeof(TEntity)))
    {
        result.Add(name, entry.Property(name));
    }
    
    return result;
}

Основы Сущности Основных:
public static IReadOnlyDictionary<string, PropertyEntry> ExtractPrimaryKey<TEntity>(this DbContext context, EntityEntry<TEntity> entry) where TEntity : class
{
    IKey primaryKey = entry.Metadata.FindPrimaryKey();
    return primaryKey.Properties.ToDictionary(p => p.Name, p => entry.Property(p.Name), StringComparer.Ordinal);
}


Рейтинг:
19

Gerry Schmitz

Если бы вы сказали: Дайте мне яблоко, а я сказал: "У меня его нет" ... Это что, "ошибка"?

Вы выполнили запрос, который не дал никаких результатов. Период.