我在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; }
}
我尝试了三种方法来实现Add操作。前两种方法都会出错。
第一种方式(不起作用):
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ć的建议,并在BaseEntity基类的主键中添加了Identity
属性,,然后对于具有int类型主键的实体,上面显示的错误消失了。
对于具有int类型主键的实体,上面显示的错误消失了:
public class BaseEntity<T>
{
[PrimaryKey Identity]
public T Id { get; set; }
}
但是,这不是一个完整的解决方案,因为我的一些实体的主键类型为Guid,所以向它们添加Identity
属性会导致另一个错误。
InsertBatch方法在不使用Identity属性的情况下工作因此,您可以在不使用"标识"列的BaseEntity类中的"标识"属性的情况下添加数据。insertbatch方法有什么区别?如何在不使用InsertBatch
方法的情况下解决上面显示的错误?
问题出在数据库表上。这就是您得到IDENTITY_INSERT错误的原因。转到SQL Server Management Studio,右键单击表"设计",并将主键列的属性"标识规范->(Is Identity)"设置为"是"。