2012-12-26 90 views
2

我正在使用dapper.rainbow將記錄插入到MSSQL數據庫中。以下是我的代碼在插入時禁用dapper.rainbow使用ID

int? id = db.RoomTypes.Insert(roomType) 

當我運行我的應用程序時,我得到下面的異常。

Cannot insert explicit value for identity column in table 'RoomTypes' 
when IDENTITY_INSERT is set to OFF. 

我認爲dapper.rainbow在插入過程中爲我的標識列使用值(默認值爲int)。這是造成這種異常的原因。我的表RoomTypes的標識列是自動遞增的,它也是我的表的主鍵。

現在,我如何停止在插入過程中使用ID列的dapper.rainbow。

回答

3

綜觀Dapper.Rainbow.Insert方法,該方法是「啞」到傳遞作爲數據參數的類型:

public virtual int? Insert(dynamic data) 
{ 
    var o = (object)data; 
    List<string> paramNames = GetParamNames(o); 

    string cols = string.Join(",", paramNames); 
    string cols_params = string.Join(",", paramNames.Select(p => "@" + p)); 
    var sql = "set nocount on insert " + TableName + " (" + cols + ") values (" + cols_params + ") select cast(scope_identity() as int)"; 

    return database.Query<int?>(sql, o).Single(); 
} 

換句話說,如果包括ID作爲參數的特性,則Dapper會嘗試將該值插入到數據庫中。正如你所看到的,如果你將IDENTITY_INSERT設置爲Off,那麼插入將失敗。

這意味着您需要創建一個不包含ID屬性的新類型以傳入方法。少數的想法浮現在腦海中:

  1. RoomTypes創建沒有ID的基類,然後就在基類傳遞給Insert方法。
  2. 創建一個動態參數,並將其傳遞給Insert方法,僅使用要插入數據庫的屬性。
  3. 重寫Insert方法和發送所述Dapper
+0

由於..我使用的動態參數,通過這種方式可以排除創建和修改字段太之前刪除ID參數。 – krishnan

+0

我不明白。現在看同一個源代碼,我看到'paramNames.Remove(「Id」);',並且它說'最後更改2012年12月5日' - 當該行被添加時。 (但是我從Nuget那裏得到的版本並沒有那一行......) – Benjol

+0

不知道發生了什麼事。當我回答這個問題時,Google代碼庫沒有'paramNames.Remove(「Id」);'。很奇怪。 –