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; }
    }

Add 操作を機能させるために 3 つの方法を試しました。最初の 2 つの方法でエラーが発生しました。

最初の方法 (動作しません):

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.

--

2 番目の方法 (機能しません):

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ć のアドバイスを試し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