私はかなり単純なコード(WCFとWindowsフォームに基づくクライアントサーバー)を書きました。コードをテストできるようにdbを更新しようとしたところ、上記の例外が発生しました。それを解決する方法はありますか?
// For testing
public void updateTable()
{
using (var db = new overlayDBEntities())
{
var overlaydb = new overlayData
{
DeviceId = "1111",
TimestampUTC = new DateTime(1990, 1, 1, 9, 9, 9),
OverlayData1 = "Yoash And Maayan"
};
db.overlayData.Add(overlaydb);
try
{
db.SaveChanges();
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
var overlaydb1 = new overlayData
{
DeviceId = "1111",
TimestampUTC = new DateTime(2000, 2, 2, 10, 10, 10),
OverlayData1 = "seconed seconed seconed "
};
db.overlayData.Add(overlaydb);
try
{
db.SaveChanges();
}
catch (Exception ec)
{
Console.WriteLine(ec.Message);
}
}
}
データベースにすでに存在する場合に行を更新する必要がある場合は、context.Add();を使用しないでください。次のように使用できます。
var overlaydb1 = new overlayData
{
DeviceId = "1111",
TimestampUTC = new DateTime(2000, 2, 2, 10, 10, 10),
OverlayData1 = "seconed seconed seconed "
};
try
{
db.overlayData.Attach(overlaydb1);
db.ObjectStateManager.ChangeObjectState(overlaydb1, EntityState.Modified);
db.SaveChanges();
}
catch (Exception ec)
{
Console.WriteLine(ec.Message);
}
この同じエラーは、ユーザーが特定のテーブルにPrimery key
を追加するのを忘れた場合にも表示され、その後、アプリケーションを介してデータを追加します。
問題はあなたの日時のタイプだと思います。 sqlseverには複数の日時があります。内部例外を確認すると、テーブルに挿入しようとしている型と実際に必要な型が表示される場合があります。変換は自動的に実行できません。テーブルで変更するか、コードで変換する必要があります。 datetime、datetime2(7)などにすることができます。
Lanによると、
「エラーメッセージには、知っておく必要のあるすべての詳細が含まれています。
追加情報: 'AppraisalDBContext'コンテキストを支えるモデルは、データベースが作成されてから変更されています。CodeFirst Migrationsを使用してデータベースを更新することを検討してください( http://go.Microsoft.com/fwlink/ ?
つまり、AppraisalDBContextで使用するクラスの1つが変更されましたが、データベースは更新されていないため、古くなっています。このコードファースト移行を使用して更新する必要があります。」
から 元の投稿
add
の場合、同じ主キーを持つデータの複数のレコードが重複し、同じエラーが発生します
主キー設定を確認する必要があります