Работает ли идентификационная вставка в EF 6 для гидов?

c# entity-framework

242 просмотра

2 ответа

В отношении выбранного ответа в Как я могу получить идентификатор вставленной сущности в Entity Framework? работать для поля идентичности, которое является Guid?

Кроме того, есть ли способ просто выполнить "SELECT @@ IDENTITY" в настройках хранилища и интерфейса?

Редактировать 1

Мне нужно иметь возможность вставить запись, используя общий метод Repo.

Моя модель:

[Table(name: "Images")]
public class ImagesViewModel
{
    [Key, Required, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid RecordID { get; set; }

    [Column(TypeName = "image")]
    public byte[] MainImage { get; set; }

    public string MainImageMimeType { get; set; }

    [Column(TypeName = "image")]
    public byte[] ImageThumbnail { get; set; }

    public string ImageThumbnailMimeType { get; set; }

    public bool Enabled { get; set; }

    public bool PrimaryImage { get; set; }

    public bool RelatedImage { get; set; }

    public Guid? RelatedImageID { get; set; }

    public ImagesViewModel()
    {
        Enabled = true;
        PrimaryImage = true;
        RelatedImage = false;
    }
}

Если бы я делал хранимую процедуру, я мог бы просто сделать SELECT @@IDENTITYи вернуть значение поля идентификации или вновь вставленной записи.

К сожалению, я использую код сначала с общим хранилищем данных. Пока у меня есть следующий метод (работа в процессе):

public virtual Guid Add<T>(T newItem) where T : class
{
    using (var context = new ApplicationDbContext())
    {
        context.Set<T>().Add(newItem);
        context.SaveChanges();

        context.Entry(newItem).

        return _ImagesViewModel.RecordID;
    };
}

Итак, я думаю, я спрашиваю, как правильно это сделать?

Редактировать 2

Вот обновленный фрагмент кода метода Add (работа в процессе):

public virtual Guid Add<T>(T entity) where T : BaseEntity
{
    using (var context = new ApplicationDbContext())
    {
        DbSet dbSet = context.Set<T>();
        dbSet.Add(entity);
        context.SaveChanges();
        return entity.RecordID;
    }
}

public abstract class BaseEntity
{
    Guid RecordID { get; set; }
}
Автор: John Schultz Источник Размещён: 08.11.2019 11:31

Ответы (2)


2 плюса

Я хотел бы предложить вам нижеприведенную реализацию. Я не знаю, возможно ли сделать это на вашей стороне или нет.

public virtual Guid Add<T>(T entity) where T : BaseEntity
    {
        using (var context = new ApplicationDbContext())
        {
            DbSet dbSet = context.Set<T>();
            dbSet.Add(entity);
            context.SaveChanges();
            return entity.Id;
        }
    }

public abstract class BaseEntity
{
   public Guid Id { get; set;}
}
Автор: Sampath Размещён: 20.08.2016 04:28

0 плюса

Решение

Я смог заставить его работать. Изменяя код в моем BLL, чтобы просто вернуть идентификатор после добавления следующим образом:

Изменить void Users_Add(SiteUsersModel _SiteUsersModel);наGuid Users_Add(SiteUsersModel _SiteUsersModel);

а также

public void Users_Add(SiteUsersModel _SiteUsersModel)
{
    _IUsersRepository.Add(_SiteUsersModel);
}

в

public Guid Users_Add(SiteUsersModel _SiteUsersModel)
{
    Guid RecordID = new Guid();
    using (var context = new ApplicationDbContext())
    {
        context.SiteUsers.Add(_SiteUsersModel);
        context.SaveChanges();
        RecordID = _SiteUsersModel.RecordID;
    }
    return RecordID;
}

Вроде бы хорошо идти.

Автор: John Schultz Размещён: 21.08.2016 07:02
Вопросы из категории :
32x32