EF Generic Repository получает идентификатор из новой вставленной общей сущности - PullRequest
8 голосов
/ 23 августа 2010

Все мои объекты имеют свойство Id.Все мои таблицы в базе данных имеют автоматически сгенерированный идентификатор целочисленного идентификатора в качестве первичного ключа.

У меня есть универсальный метод для создания объектов.

Есть ли способ получить идентификатор объекта после объекта, вставленного в базу данных?

   public override int Create<T>(T entity)
    {
        string entitySet = GetEntitySetName<T>();
        _context.AddObject(entitySet, entity);
        _context.SaveChanges();

        return <Id Here>; //TODO Return Id here
    }

В простом (не универсальном) репозитории я могу просто вернуть Entity.Id, но как получить такое же поведение в универсальном репозитории?У меня может быть базовый класс сущностей для всех сущностей, который содержит идентификатор свойства int, но есть ли способ заставить его работать без реализации этого наследования?

Ответы [ 4 ]

16 голосов
/ 24 февраля 2011

На самом деле это может быть очень просто;

// Project is is object/table, no POCO here.

var newProj = new Project();
newProj.Name = "Blah project";

var db = new AppDataContextname();

db.Projects.AddObject(newProj);

// at this point, newProj.ID is NOT set

db.SaveChanges(); // record is added to db.
// now, the ID property of the Project object is set!!!

// if the last ID in that table is '25', and you have auto-increment,
// then the object's ID property will now be 26!
Console.WriteLine(newProj.ID); // will output "26"

Долго ломал голову над тем, как вернуть идентификатор, пока не понял, что приведенный выше код работает. Работает в Linq-To-SQL и EF4.

4 голосов
/ 23 августа 2010

С сущностями POCO вам придется использовать интерфейс, отражение или dynamic.

С EntityObject сущностями вы можете прочитать свойство EntityKey.

3 голосов
/ 05 января 2011

Решение:

 public override TR Create<T, TR>(T entity)
    {
        string entitySet = GetEntitySetName<T>();
        _context.AddObject(entitySet, entity);
        _context.SaveChanges();

        //Returns primaryKey value
        return (TR)context.CreateEntityKey(entitySet, entity).EntityKeyValues[0].Value;                       
    }

Где T: тип объекта, TR: тип ПК объекта.

1 голос
/ 15 июня 2014
 With reflection you can obtain the Id property.


public override int Create<T>(T entity)
    {
        string entitySet = GetEntitySetName<T>();
        _context.AddObject(entitySet, entity);
        _context.SaveChanges();

         var idProperty = item.GetType().GetProperty("Id").GetValue(entity,null);
         return (int)idProperty;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...