Как вы возвращаете идентификатор пользователя с помощью универсального метода репозитория в entity Framework?

#c# #asp.net-mvc #entity-framework-6

#c# #asp.net-mvc #entity-framework-6

Вопрос:

Я хочу вернуть ключевое поле, выполнив что-то вроде этого:

 public virtual int InsertWithReturnId(TEntity entity)
        {

            dbSet.Add(entity);
            return entity.Id;
        }
  

Большое спасибо

ПРАВКА # 1:

Мне не нужно сохранять изменения… это делается следующим образом:

     public GenericRepository<Group> GroupRepository
            {
                get
                {

                    if (this.groupRepository == null)
                    {
                        this.groupRepository = new GenericRepository<Group>(context);
                    }
                    return groupRepository;
                }
            }
  

Мое извлечение (успешно сохраняет группу)

 public class GroupMethods
    {
        private UnitOfWork uow;
        public GroupMethods() { this.uow = new UnitOfWork(); }
    public int createGroup(string groupName)
            {
                Debug.WriteLine(groupName);
                Debug.WriteLine(HttpContext.Current.User.Identity.GetUserName());
                ApplicationUser user = ClanMethods.getUser(HttpContext.Current.User.Identity.GetUserName());

                if(groupName != "" amp;amp; user != null)
                {
                    Debug.WriteLine("inside if");
                    Group grp = new Group();
                    grp.creator = user;
                    grp.Members.Add(user);
                    grp.GroupName = groupName;
                    var id = uow.GroupRepository.InsertWithReturnId(grp);
                    uow.Save();
                    Debug.WriteLine("id:" id);

                    Debug.WriteLine("stops here");
                    Debug.WriteLine("grp id:" grp.GroupId);
                    return id;
                }
                return 0;
            }
}
  

Я надеялся, что смогу выполнить grp.groupId, но он продолжает терпеть неудачу, поэтому я думаю, что нет. Интерфейс будет обновляться через 20 минут

ПРАВКА # 3

Я получаю:

 Warning 1   Type parameter 'TEntity' has the same name as the type parameter from outer type 'gdfinal.DAL.GenericRepository<TEntity>'
Error   2   The best overloaded method match for 'System.Data.Entity.DbSet<TEntity>.Add(TEntity)' has some invalid arguments
Error   3   Argument 1: cannot convert from 'TEntity [....DALGenericRepository.cs(16)]' to 'TEntity'  
Error   4   The type '...chatmodels.Group' cannot be used as type parameter 'TEntity' in the generic type or method '....GenericRepository<TEntity>.InsertWithReturnId<TEntity>(TEntity)'. There is no implicit reference conversion from '....Models.chatmodels.Group' to 'gdfinal.DAL.IIdentifier'.   
  

при использовании

 public virtual int InsertWithReturnId<TEntity>(TEntity entity) where TEntity : IIdentifier
        {
            dbSet.Add(entity);
            return entity.Id;
        }
  

Он успешно наследует интерфейс, но на самом деле ему это не нравится 🙁

Комментарии:

1. Похоже, вам нужен интерфейс.

2. Вы имеете в виду, что ваш Id является столбцом идентификатора, и вы хотите вернуть вновь сгенерированный идентификатор?

3. уверен, что вам просто нужен .SaveChanges() там. Идентификатор не присваивается до тех пор, пока изменения не будут сохранены

Ответ №1:

Создайте интерфейс для использования вашего объекта EF.

 public interface IIdentifier
{
    int Id { get; set; }
}
  

Затем измените свой метод (и я предполагаю, что TEntity это общий аргумент)

 public virtual int InsertWithReturnId<TEntity>(TEntity entity)
    where TEntity : IIdentifier
{
    dbSet.Add(entity);
    //save changes()?
    return entity.Id;
}
  

Если TEntity является общим аргументом для вашего класса, то вместо этого добавьте where ограничение к классу.

Теперь, поскольку EF автоматически генерирует ваши классы, используйте Partials для добавления интерфейса (в отдельный файл)

 public partial class <NameOfObject> : IIdentifier { }
  

Поскольку у класса уже есть свойство с именем Id , вам не нужно определять его здесь.

Комментарии:

1. пробуя это сейчас, почему это «где TEntity: IIdentity»? Спасибо

2. where это общее ограничение, в нем говорится, что универсальный тип TEntity должен подразумевать IIdentity .

3. а не где TEntity: IIdentifier?

4. О, вау, пропустил это, исправлено. Это идентификатор, а не идентификатор (я слишком много программировал на sql).

5. Я получаю ошибки — пожалуйста, смотрите Редактирование # 3. большое спасибо за это!

Ответ №2:

После SaveChanges() вы можете получить значение идентификатора из объекта модели, такого как ваш код (return entity.Id) Итак, ваш код будет выглядеть следующим образом:

 public virtual int InsertWithReturnId(TEntity entity)
        {

            dbSet.Add(entity);
            Context.dbSet.SaveChanges();

            return entity.Id;
        }
  

Комментарии:

1. Я думаю, что весь смысл был в том, что «вы не знаете, какой тип entity есть, он общий». Итак, вы не знаете, что у этого entity есть Id поле.