我在 asp .Net MVC 项目中使用 BaseRepository。编辑操作有效,但在添加操作中,我应该做一个技巧让它工作。详细来说,我的基础存储库和 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;
}
--
编辑操作没有错误,但是对于添加操作我需要做一些技巧。正常的 Add 操作有什么问题,有没有办法让它工作?
我尝试了@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
方法的情况下解决上面显示的错误?