Сначала получите значение первичного ключа произвольной сущности в коде - PullRequest
15 голосов
/ 31 августа 2011

Есть ли такой способ?

object GetPrimaryKeyValue(DbEntityEntry entry);

Или как это должно быть реализовано?

Ответы [ 3 ]

30 голосов
/ 10 ноября 2011

Вам необходимо преобразовать DbContext в IObjectContextAdapter, чтобы получить доступ к базовому ObjectContext, который дает вам доступ к некоторым более продвинутым функциям, скрытым DbContext.

Внутри вашего класса, который наследуетсяDbContext будет работать следующий метод.

object GetPrimaryKeyValue(DbEntityEntry entry)
{
    var objectStateEntry = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager.GetObjectStateEntry(entry.Entity);
    return objectStateEntry.EntityKey.EntityKeyValues[0].Value;
}

Если имеется более одного ключа, вам следует перебрать свойство EntityKeyValues.

0 голосов
/ 23 февраля 2017

Вам не нужно прикрепленный T item.Это может быть долго, но это работает.

public object[] GetPrimaryKeyValues<T>(DbContext databaseContext, T item)
{
  return ((IObjectContextAdapter)databaseContext).ObjectContext.CreateEntityKey(typeof(T).Name.Pluralize(), item).EntityKeyValues.Select(kv => kv.Value).ToArray();
}

Тип возврата подходит для использования, например, в Find.Видите, ключевые значения на самом деле являются массивом объектов.

Если вам нужен Pluralize (), вот оно:

using System;
using System.Data.Entity.Design.PluralizationServices;
using System.Linq;
using System.Reflection;

namespace Atlas.Core.Kernel.Extensions
{
    public static class Strings
    {
      private static PluralizationService pluralizationService = PluralizationService.CreateService(System.Globalization.CultureInfo.CurrentUICulture);
      public static string Pluralize(this MemberInfo memberInfo)//types, propertyinfos, ect
      {
        return Pluralize(memberInfo.Name.StripEnd());
      }

      public static string Pluralize(this string name)
      {
        return pluralizationService.Pluralize(name); // remove EF type suffix, if any
      }



    }
  }
0 голосов
/ 01 июня 2016

Я также ищу первичный ключ сущности. Я использую Generics в своем хранилище, поэтому я не знаю Entity до времени выполнения. Пока я нашел единственный способ сделать это с помощью оператора sql.

public abstract class GenericRepository<T> : ApiController,IGenericRepository<T> where T : class
{


    string sqlstr = @"
        SELECT COLUMN_NAME
        FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
        WHERE OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA + '.' + CONSTRAINT_NAME), 'IsPrimaryKey') = 1
        AND TABLE_NAME = '" + typeof(T).ToString() + "' AND TABLE_SCHEMA = 'dbo'";

    private Entities _entities = new Entities();


    public  virtual IQueryable<T> GetAll()
    {
        DbSqlQuery<T> queryTest = _entities.Set<T>().SqlQuery(sqlstr);

Это просто пример полного класса, но, надеюсь, показывает решение, которое я использую.

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