Проверьте, есть ли у generi c DbSet ключ идентификации - PullRequest
0 голосов
/ 12 февраля 2020

Вопрос : имея родовой номер c DbSet<T>, как я могу узнать, имеет ли класс T идентификационный ключ?

Это мой случай:

public static string SqlCodeGenerator<T>(DbContext context) where T : class
{
    var query = string.Emtpy;
    var set = context.Set<T>();

    if (set.HasIdentity())
        query += "SET IDENTITY_INSERT ON;\n";

    // Continue building query...
}

Мне не нужно знать, какое свойство, только если оно имеет или не имеет (хотя дает дополнительные очки для ответа).

Ответы [ 2 ]

2 голосов
/ 12 февраля 2020

Более гибкий подход, напрямую не связанный с SQL Сервером, но он охватывает столбцы идентификаторов. Как минимум те свойства, которые помечены [DatabaseGenerated(DatabaseGeneratedOption.Identity)] атрибутом

foreach (var key in dbContext.Model.FindEntityType(typeof(Entity)).GetKeys())
{
    foreach (var property in key.Properties)
    {
        if (property.ValueGenerated == Microsoft.EntityFrameworkCore.Metadata.ValueGenerated.OnAdd)
        {
            Console.WriteLine("gotcha!");
        }
    }
}
1 голос
/ 12 февраля 2020

Решено с некоторой креативностью и Linq:

var efEntity = context.Model.FindEntityType(typeof(T));
var efProperties = efEntity.GetProperties();

var hasIdentity = efProperties.Any(p => (SqlServerValueGenerationStrategy)
    p.FindAnnotation("SqlServer:ValueGenerationStrategy").Value
    == SqlServerValueGenerationStrategy.IdentityColumn);

var identityProperty = efProperties.FirstOrDefault(p => (SqlServerValueGenerationStrategy)
    p.FindAnnotation("SqlServer:ValueGenerationStrategy").Value
    == SqlServerValueGenerationStrategy.IdentityColumn);

С библиотеками:

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;
using System.Linq;
...