2017-11-14 5 views
0

NPOCOを使用して保存する方法がありますが、1つのモデルを除いて正常に動作しています。NPOCO特定のモデルでのみ動作しない保存

public bool Upsert<T>(T record, string message) 
     { 
      try 
      { 
       using (var db = new Database(GetConnStr(), DatabaseType.SqlServer2008)) 
       { 
        db.Save(record); 
        return true; 
       } 
      } 
      catch (Exception x) 
      { 
       //log exception 
       return false; 
      } 
     } 

このコードは機能し、いくつかのモデルで使用しています。ただし、次のモデルと、それは保存していない任意のエラーを投げていない:

[PrimaryKey("LoginName")] 
public class TableName 
{ 
    public string LoginName { get; set; } 
    public string RealName { get; set; } 
    public string Tag { get; set; } 
} 

私は、デバッグ、コードを通じて段階とモデルにデータが含まれ、保存方法がヒットして、例外がスローされない確認しました。モデル名を間違った値に変更し、正しいエラーinvalid object nameを取得しました。しかし、私はそれを正しい名前に戻すと、データは保存されず、エラーもスローされません。私は手動で管理スタジオを使用してデータベースに同じレコードをエラーなしで挿入しました(隠されたDBエラーがないことを確認するだけです)。

UPDATE: は何らかの理由でそれがNPOCOLoginNameをマッピングされていないようです。私がすることで、この結論に達しました:

次のエラーがスローされますNPOCO SingleByIdを使用して
  1. 「のマッピングは、オブジェクト型から存在していない<> f__AnonymousType42`1 [[可能System.String、mscorlib、バージョン= 4.0.0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089]]を既知のマネージプロバイダのネイティブタイプに変換します。

  2. Saveの代わりにInsertメソッドを使用しました。私がそれをすると、エラーが出ます:

    "'LoginName'列、 'TableName'列に値を挿入できません;列はNULLを許可しません。INSERTは失敗します。\ r \ n文は終了しました。

モデルはすべての値を持っているにもかかわらず、私は、デバッガを通してそれを点検するとき。

upsertであるため、saveはエラーをスローしないと思われます。

答えて

1

は、LoginNameには、自動インクリメントフィールドではありませんので、それはレコードを追加することはできません

[PrimaryKey("LoginName", AutoIncrement=false)] 

にあなたの主キーの定義を変更してみてください。 AutoIncrementのデフォルトはTrueです。

+0

ありがとうございます。 – zulq

関連する問題