0

我在 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方法的情况下解决上面显示的错误?

4

1 回答 1

1

问题在于您的数据库表。这就是您收到 IDENTITY_INSERT 错误的原因。转到 SQL Server Management Studio,右键单击表 Design,然后将主键列的属性 Identity Specification -> (Is identity) 设置为 Yes。

于 2013-12-12T08:15:26.740 回答