Ошибка вставки данных 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.