#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
поле.