我在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操作我需要做一些技巧。普通的Add操作有什么问题,有没有办法让它工作?
我尝试了@MladenMacanović的建议,并且我将Identity
属性添加到基本BaseEntity类中的主键,然后上面显示的错误消除了具有int类型主键的实体。
上面显示的错误消除了具有int类型主键的实体:
public class BaseEntity<T>
{
[PrimaryKey Identity]
public T Id { get; set; }
}
但是,这不是一个完整的解决方案,因为我的某些实体在Guid 类型中具有主键,因此向其添加Identity
属性会产生另一个错误。
InsertBatch方法在不使用Identity属性的情况下工作。因此,您可以在IdentityE的BaseEntity类中不使用Identity属性添加数据。 insertbatch方法有什么区别?如何在不使用InsertBatch
方法的情况下解决上面显示的错误?
答案 0 :(得分:1)
问题在于您的数据库表。这就是为什么你得到IDENTITY_INSERT错误。转到SQL Server Management Studio,右键单击表,设计,并为主键列设置属性Identity Specification - &gt; (身份)是的。