BlToolkit在BaseRepository类中插入数据失败

时间:2013-12-11 10:31:06

标签: asp.net-mvc-4 repository-pattern bltoolkit

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

1 个答案:

答案 0 :(得分:1)

问题在于您的数据库表。这就是为什么你得到IDENTITY_INSERT错误。转到SQL Server Management Studio,右键单击表,设计,并为主键列设置属性Identity Specification - &gt; (身份)是的。