Ошибка вставки данных BlToolkit в классе BaseRepository

Я использую BaseRepository в проекте asp .Net MVC. Операция редактирования работает, но в операции Добавить, я должен сделать трюк, чтобы она работала. Подробно, мой базовый репозиторий и классы BaseEntity:

public class BaseRepository<TEntity, T> : IRepository<TEntity, T> where TEntity : BaseEntity<T>
{
    private DbManager _context;

    private Table<TEntity> Table
    {
        get { return _context.GetTable<TEntity>(); }
    }

    public BaseRepository(DbManager context)
    {
        _context = context;
    }

    //...

    public TEntity Add(TEntity entity)
    {
        //...

        return entity;
    }

    public TEntity Edit(TEntity entity)
    {
        _context.Update(entity);

        return entity;
    }

    //...
}

public class BaseEntity<T>
    {
        [PrimaryKey]
        public T Id { get; set; }
    }

Я попробовал три способа добавить операцию, чтобы она заработала. Первые два способа дали ошибки.

Первый способ (не работает):

public TEntity Add(TEntity entity)
    {
        _context.Insert(entity);            

        return entity;
    }

Сообщение об ошибке:Cannot insert explicit value for identity column in table '...' when IDENTITY_INSERT is set to OFF.

-

Второй способ (не работает):

public TEntity Add(TEntity entity)
    {
        Table.Insert(() => entity);          

        return entity;
    }

Сообщение об ошибке:Operation is not valid due to the current state of the object.

-

Третий способ (рабочий):

public TEntity Add(TEntity entity)
    {
        var l = new List<TEntity> { entity };
        _context.InsertBatch(l);            

        return entity;
    }

-

Операция редактирования работает без ошибок, но для операции добавления мне нужно сделать некоторую хитрость. В чем проблема с обычной операцией добавления и есть ли способ заставить ее работать?

Я попробовал совет @Mladen Macanović и добавил Identity приписать первичный ключ в базовом классе BaseEntity, а ошибки, показанные выше, исчезли для сущностей, имеющих первичный ключ типа int.

Ошибки, показанные выше, пропали для сущностей, имеющих тип int первичного ключа:

public class BaseEntity<T>
    {
        [PrimaryKey Identity]
        public T Id { get; set; }
    }

Но это не полное решение, потому что некоторые из моих сущностей имеют первичный ключ типа Guid, поэтому добавление Identity Атрибут к ним дает еще одну ошибку.

Метод InsertBatch работает без использования атрибута Identity. Таким образом, вы можете добавлять данные, не используя атрибут Identity в классе BaseEntity для столбца Identity. В чем отличие метода insertbatch? Как я могу устранить ошибки, показанные выше, не используя InsertBatch метод?

1 ответ

Проблема в вашей таблице базы данных. Вот почему вы получаете ошибку IDENTITY_INSERT. Перейдите в SQL Server Management Studio, щелкните правой кнопкой мыши таблицу "Дизайн" и для столбца первичного ключа задайте для свойства Identity Specification -> (Is identity) значение Yes.

Другие вопросы по тегам