エンティティフレームワーク:「ストアの更新、挿入、または削除ステートメントが予期しない行数(0)に影響しました。」[閉まっている]


324

Entity Frameworkを使用してグリッドコントロールにデータを入力しています。更新を行うと、次のエラーが発生することがあります。

ストアの更新、挿入、または削除ステートメントは、予期しない行数(0)に影響を与えました。エンティティが読み込まれた後に、エンティティが変更または削除された可能性があります。ObjectStateManagerエントリを更新します。

これを再現する方法がわかりません。しかし、それは私がどれほど近づいて更新を行うかに関係があるかもしれません。誰かがこれを見たことがありますか、または誰かがエラーメッセージの意味を知っていますか?

編集:残念ながら、このプロジェクトから離れて、最終的に解決策を見つけたのか、別の開発者が修正したのか、または私がそれを回避したのか覚えていないため、ここで抱えていた問題を再現する自由はありません。そのため、一切お答えできません。


このエラーが発生したのは、SQL Serverの行レベルのセキュリティポリシーの導入で、行を更新できない状態に更新できるようにしたものです(許容的なBLOCK述語を持つ排他的なFILTER述語)。EntityFrameworkでは、更新後に更新された行を読み戻す必要があります。そうでない場合は、同時性エラーであると想定されます(少なくとも楽観的同時実行を使用する場合)。
xr280xr

問題は、DBContextの誤ったスコープである可能性がありますstackoverflow.com/questions/49154250/…(この例はASPNET Identityですが、あらゆるコンテキストに適用されます)
Simon_Weaver

このエラーのコンテキストに関係なく、コンテキストがインスタンス化されている場所にブレークポイントを置くことをお勧めします。Webページを読み込んだときに1回インスタンス化されることを期待していましたが、そのブレークポイントに5回ヒットしていますか?次に、おそらく競合状態があります。Request.Uri実際のリクエストURLを確認してください。私の場合、私のサイトに到達し、DBから不必要にコンテキストをロードしている(そして時々それも更新している)追跡ロジックがありました。そのため、私がデバッグしていた実際のページでは、そのデータが愚かな追跡コードロジックによって踏みつけられていました。
Simon_Weaver 2018

ビューに@ Html.AntiForgeryToken()を追加
Vikas Sharma

回答:


199

これは、楽観的同時実行と呼ばれる機能の副作用です。

Entity Frameworkでオン/オフを切り替える方法は100%わかりませんが、基本的には、データベースからデータを取得してから変更を保存したときに、他の誰かがデータを変更したことになります(これは、それを保存するために、0行が実際に更新されました)。SQL用語では、updateクエリのwhere句には行のすべてのフィールドの元の値が含まれ、影響を受ける行が0の場合、何かが間違っていることがわかります。

その背後にある考え方は、アプリケーションが発生したことを知らなかった変更を上書きしてしまうことはないということです。これは基本的に、すべての更新で.NETによってスローされる小さな安全対策です。

一貫している場合は、独自のロジック内で発生している可能性があります(例:選択と更新の間にある別のメソッドで実際にデータを自分で更新している)が、2つのアプリケーション間の単なる競合状態である可能性があります。


34
これはシングルユーザー環境(私の開発マシン上)で発生しているため、競合状態になることはないと思います。EntityDataSourceを使用してカスタムグリッドコントロールにバインドしているので、舞台裏で何が起こっているのか正確にはわかりませんが、テーブルを変更する独自のコードはありません。この同時実行設定を変更する方法はありますか?
強い意見2009

3
エンティティモデル(プロパティウィンドウにあります)では列ごとに設定できると思いますが、重要なのは、エラーが表示されず、何も更新されないことです。データベースに送信されるSQLコマンドを表示できますか(例:MSSQLのSQL Server Profiler)。これにより、どの更新が生成されたかを確認でき、その更新が行に影響を与えない理由を確認できるはずです。
fyjham、2009

9
エンティティにタイムスタンププロパティがある場合は、それがビューに保存されていることを確認し、エンティティにタイムスタンプが適切に入力されていることを確認してください。
IBMの2013

タイムスタンプ列があり、それに対処すると、ヒント@anelBMerのおかげでEF6.1は期待どおりに機能しました
JQII

3
タイムスタンプを使用する場合、削除するtjeオブジェクトには、PKセットとRowVersionプロパティが必要です。オブジェクトをそれぞれのDbSetにアタッチした後、rowVersion(timestamp)プロパティを設定していたため、機能しませんでした。よくやった!
Legends、

394

これに遭遇しましたが、それはエンティティのID(キー)フィールドが設定されていないことが原因でした。したがって、コンテキストがデータを保存しようとしたときに、ID = 0を見つけることができませんでした。更新ステートメントにブレークポイントを配置し、エンティティのIDが設定されていることを確認してください。

Paul Belloraのコメントより

.cshtml編集ページに非表示のID入力を含めるのを忘れたことが原因で、この正確な問題が発生しました


3
+1私は同じ問題を抱えていて、これが解決策を見つけるのに役立ちました。エンティティのIDの値がHttpPostでゼロになる原因となっていたOrderモデルに[Bind(Exclude = "OrderID")]があったことがわかりました。
Dhaust 2012年

2
それがまさに私が欠けていたものです。私のオブジェクトのIDが0だった
アズハルKhorasany

4
@ Html.HiddenFor(model => model.productID)-完全に機能しました。編集ページ(MVC RAZOR)にproductIDがありませんでした
Ravi Ram

2
同様の問題がありましたが、ひねりを加えました。私にとっての問題は、SQLテーブルが正しく設定されていなかったことです。主キーフィールドが自動インクリメントに設定されていません。したがって、EFがキーを挿入しようとしていたレコードを送信しますが、フィールドが自動インクリメントIDフィールドであることをsqlに伝えることを忘れない場合は問題ありません。<
Agile Noob

1
同じ問題ですが、複合キーを使用しています。キー値の1つが設定されていません。
obaylis 2015

113

うわー、たくさんの答えがありますが、他の人が言及していない少し異なることをしたときにこのエラーが発生しました。

要するに、新しいオブジェクトを作成し、EntityState.Modifiedそれを使用して変更されたことをEFに通知すると、データベースにまだ存在していないため、このエラーがスローされます。これが私のコードです:

MyObject foo = new MyObject()
{
    someAttribute = someValue
};

context.Entry(foo).State = EntityState.Modified;
context.SaveChanges();

はい、これはふさわしいようですが、foo以前に作成された問題のメソッドが以前に作成されていたsomeValueために発生しました。fooそれ自体ます。

簡単な修正、行を変更EntityState.ModifiedするEntityState.Addedか、行全体を次のように変更します。

context.MyObject.Add(foo);

これを投稿してくれてありがとう。それも私の問題でした。StateをEntityState.Modifiedに設定するコードをコピーして貼り付けました。
クレイレイ

23

私はこの同じ恐ろしいエラーに直面していました... :)その後、私は設定するのを忘れていることに気付きました

@Html.HiddenFor(model => model.UserProfile.UserId)

更新されるオブジェクトの主キーについて!私はこの単純な、しかし非常に重要なことを忘れがちです!

ちなみに、HiddenForASP.NET MVC用です。


3
これはセキュリティ上の欠陥のようUserIdです。フォームに保存すると、ハッカーが発生しやすくなります...これは、その後に入力されますHttpContext.Current.User.Identity.Name
Serj Sagan 2013

@SerjSagan正解です...しかし、サーバー側でUserIdと現在のUserNameを確認するためにいくつかのチェックを行っていれば、問題ありません。
Leniel Maccaferri 2013

1
私のポイントはHiddenForHttpContextとにかくそれをあなたがそれからそれを取得する必要があるあなたに保存する理由です...私はこのプロパティをフォームにまったく入れないでしょう、それは私に常にそれをサーバー側に入力することを強いるでしょう...
Serj Sagan

16

GridViewの「DataKeyNames」属性を忘れたかどうかを確認します。GridView内でデータを変更する場合は必須です

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.datakeynames.aspx


+1。私にとって完璧でシンプルなソリューション。GridViewをEntityDataSourceにバインドしていますが、オブジェクトの主キーにこれを設定していません。
アンデス2012

Kendo UIが複合キーをサポートしていないことはわかっていますが、キーを連結した新しい列を1つに追加した場合、どうなりますか?
Branislav 2013

15

この問題は、次の2つのいずれかが原因で発生します。

  1. 1つ以上のプロパティがConcurrency Mode: Fixed..の行を更新しようとしましたが、オプティミスティック並行性によりデータを保存できませんでした。すなわち。一部は、サーバーデータを受信して​​からサーバーデータを保存するまでの間に行データを変更しました。
  2. 行を更新または削除しようとしましたが、行が存在しません。取得と保存の間にデータを変更(この場合は削除)する別の例、またはID(つまりStoreGeneratedPattern = Computed)ではないフィールドを更新しようとしていて、その行が存在しない場合。

1
これは、割り当てられているすべてのオブジェクトプロパティに、以前と同じ値が割り当てられている場合にも発生する可能性があります。
Serj Sagan 2013

2番目の+1。StoreGeneratedPattern =なし、StoreGeneratedPattern = Identityに変更すると問題が解決しました。ありがとう
tkt986

12

PKの一部が日時列であり、挿入されるレコードがその列の値としてDateTime.Nowを使用したため、同じエラーが発生しました。エンティティフレームワークは、ミリ秒の精度で値を挿入し、ミリ秒の精度で挿入したばかりの値を探します。ただし、SqlServerは値を秒の精度に丸めたため、エンティティフレームワークはミリ秒の精度の値を見つけることができませんでした。

解決策は、挿入する前にDateTime.Nowからミリ秒を切り捨てることでした。


2
値のあるDate列に挿入することを除いて、同じ問題がありましたDateTime
adam0101

1
こっちも一緒。データウェアハウスのレコードがあり、タイムスタンプをキーの一部として使用していました。データウェアハウスのタイムスタンプはSQL DateTimeでしたが、C#のタイムスタンプは一致しませんでした。SQLデータ型をDateTime2(7)に変更し、EFモデルを更新して、すべて修正しました。
mmcfly

列をDatetime2(7)に変更することもうまくいきました。ありがとう@mmcfly
Dzejms

10

私は同じ問題を抱えていましたが、@ webtrifusionの回答が解決策を見つけるのに役立ちました。

私のモデルはBind(Exclude)エンティティのIDの属性を使用していたため、エンティティのIDの値がHttpPostでゼロになりました。

namespace OrderUp.Models
{
[Bind(Exclude = "OrderID")]
public class Order
{
    [ScaffoldColumn(false)]
    public int OrderID { get; set; }

    [ScaffoldColumn(false)]
    public System.DateTime OrderDate { get; set; }

    [Required(ErrorMessage = "Name is required")]
    public string Username { get; set; }
    }
}   

同様の問題、セキュリティ上の理由から、Bind(include = some fields)があります。IDはリストにありませんでした。また、非表示の入力として追加しました。MVCによって生成されたものを消去したか、IDがまったくありませんでした。助けてくれてありがとう。
MusicAndCode 2017

10

同じ問題がありましたが、それはnullであるRowVersionが原因であることがわかりました。IdRowVersionnullでないことを確認してください。

詳細については、このチュートリアルを参照してください

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/handling-concurrency-with-the-entity-framework-in-an-asp-net-mvc-application


私の場合、行バージョンはnullでした
Prakash、2015

私の場合、[Bind(Include = properties)]のIdフィールドを誤って削除しました。もう一度追加すると、問題なく動作しました。
Caverman、2016年

8

モデルファーストからコードファーストに変更した後、このエラーが発生し始めました。データベースを更新する複数のスレッドがあり、一部は同じ行を更新する場合があります。なぜmodel-firstを使用しても問題がなかったのかわかりません。別の並行処理のデフォルトを使用していると仮定します。

発生する可能性のある条件を認識して1か所で処理するために、次のオーバーロードをDbContextクラスに追加しました。

using System.Data.Entity.Core.Objects;
using System.Data.Entity.Infrastructure;

public class MyDbContext: DbContext {
...
        public int SaveChanges(bool refreshOnConcurrencyException, RefreshMode refreshMode = RefreshMode.ClientWins) {
            try {
                return SaveChanges();
            }
            catch (DbUpdateConcurrencyException ex) {
                foreach (DbEntityEntry entry in ex.Entries) {
                    if (refreshMode == RefreshMode.ClientWins)
                        entry.OriginalValues.SetValues(entry.GetDatabaseValues());
                    else
                        entry.Reload();
                }
                return SaveChanges();
            }
        }
}

次に、SaveChanges(true)該当する場所に呼び出されます。


1
さて、他の誰もが問題について順調に進んでおり、どのようにしてそれを引き起こすことができるかなどを示していますが、この答えは素晴らしい答えです。私は継続更新モデル(ここでは保存ボタンなし)を使用しており、EFスレッドが遅れているときにグリッド更新でこれを取得していて、それを解決しました。見事な作品私の良い名前..あなたは私をヒーローのように見せました-巨人の肩の上に立っています!!
トニーTrembath-Drake

、あまりにも多くのオプション-のためにこれを見て私を助けてくれstackoverflow.com/a/13891724/4836581
のZvi Redler

7

主キーのBoundFieldを明示的に含める必要があります。ユーザーに主キーを表示したくない場合は、cssで非表示にする必要があります。

    <asp:BoundField DataField="Id_primary_key" ItemStyle-CssClass="hidden" 
HeaderStyle-CssClass="hidden" />

'hidden'は、表示が 'none'に設定されているcssのクラスです。


1
ああ、あなたは私がASP.NET MVCの私の隠されたIDフィールドを削除したという事実に私を導きました。@Paulo、ありがとう!:)
Tomasz Iniewicz

7

編集中に、エンティティのIDまたは主キーをビューの非表示フィールドとして含めます

すなわち

      @Html.HiddenFor(m => m.Id)

それは問題を解決します。

また、モデルに未使用のアイテムが含まれている場合は、それも含めてコントローラーに投稿します


7

このエラーにも遭遇しました。判明した問題は、保存しようとしたテーブルのトリガーが原因でした。トリガーは 'INSTEAD OF INSERT'を使用しました。これは、そのテーブルに0行が挿入されたことを意味するため、エラーが発生します。幸いなことに、場合によってはトリガー機能が正しくありませんでしたが、コードで何らかの方法で処理する必要のある有効な操作である可能性があります。これが誰かを助けることを願っています。


2
エンティティは、トリガーからSELECTステートメント(主キー列を含む)を返すことによって行が追加されたと信じ込ませることができます。
2016

1
@jahuによるコメントを拡張するには、トリガーから返される新しく挿入されたアイテムの実際のIDを取得する必要があり、列名はトリガーテーブルのID列と一致する必要があります(私の場合、実際にはビューなので、独自のIDはありませんが、edmxをだましてだと信じ込ませました)。私のトリガーは別のテーブルへの挿入を行っていたので、次の最後の行をトリガーに追加しました:SELECT SCOPE_IDENTITY() as MyViewId
DannyMeister

:また、この質問を参照 stackoverflow.com/questions/5820992/...
J. Polfer

私の場合、子コレクション内のエンティティに対して削除操作を実行していましたが、子エンティティの1つに対して削除のトリガーがあり、別の子エンティティが削除されました。エンティティフレームワークが削除する前に、子エンティティ自体の1つを削除するトリガーが原因でN-1行が影響を受けたため、これによりエラーが発生しました。
skeletank 2017年

6

主キーがなく、DATETIME(2、3)列があるテーブルでこの問題に遭遇しました(そのため、エンティティの「主キー」はすべての列の組み合わせでした)...挿入を実行すると、タイムスタンプがありましたより正確な時刻(2018-03-20 08:29:51.8319154)は(2018-03-20 08:29:51.832)に切り捨てられたため、キーフィールドの検索は失敗します。


5

私にもこのエラーがありました。エンティティが実際のデータベースコンテキストを認識していない場合や、モデルが異なる場合があります。このために、次のように設定します。EntityState.Modified; EntityState.Added;

これをする:

if (ModelState.IsValid)
{
context.Entry(yourModelReference).State = EntityState.Added;
context.SaveChanges();
}

これにより、エンティティは、使用している状態を使用または追加していることを確実に認識します。この時点で、すべての正しいモデル値を設定する必要があります。バックグラウンドで行われた可能性のある変更を失わないように注意してください。

お役に立てれば。


1
あなたはグルです!私にとってはその作品!
Hernaldo Gonzalez

5
  @Html.HiddenFor(model => model.RowVersion)

私のrowversionはnullだったので、これを私の問題を解決したビューに追加する必要がありました


RowVersionをビューから編集アクションに渡していないのに加えて、RowVersionのモデルバインディングを行うのを忘れていました。オブジェクトをdbに保存するときに、並行性チェックのために、オブジェクトとともにRowVersionの以前の値をdbに送信する必要があります。あなたは物事をより速く必要とするとき、あなたは愚かな間違いを犯します!
Dhanuka777 2016年

5

[DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.None)]私の場合、ラインはトリックをしました:

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;


[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int? SomeNumber { get; set; }

4

テーブルとフォームの両方で主キーとedmxが更新されていることを確認してください。

更新中のエラーは通常、次の原因が原因であることがわかりました。-テーブルに主キーがない-編集ビュー/フォームに主キーがない(例@Html.HiddenFor(m=>m.Id


4

私も同じ問題を抱えていました。私の場合、許可されていない主キーを更新しようとしました。


4

asyncメソッドを使用すると、このエラーが散発的に発生しました。同期メソッドに切り替えて以来、発生していません。

エラーが散発的に:

[Authorize(Roles = "Admin")]
[HttpDelete]
[Route("file/{id}/{customerId}/")]
public async Task<IHttpActionResult> Delete(int id, int customerId)
{
    var file = new Models.File() { Id = id, CustomerId = customerId };
    db.Files.Attach(file);
    db.Files.Remove(file);

    await db.SaveChangesAsync();

    return Ok();
}

常に機能します:

[Authorize(Roles = "Admin")]
[HttpDelete]
[Route("file/{id}/{customerId}/")]
public IHttpActionResult Delete(int id, int customerId)
{
    var file = new Models.File() { Id = id, CustomerId = customerId };
    db.Files.Attach(file);
    db.Files.Remove(file);

    db.SaveChanges();

    return Ok();
}

これで私の問題は解決しましたが、PKと行のバージョンに関するこの投稿で前述した根本的な問題を指摘するのに役立ちました。PKが命名規則に従っていないという事実によってさらに複雑になった新しいテーブルのスキーママップを追加することを怠っていました。<テーブル名> ID。
midohioboarder

3

DB内のいくつかの行を(ループ内で)削除し、同じテーブルに新しい行を追加すると、エラーが発生しました。

私の解決策は、ループの各反復で動的に新しいコンテキストを作成することでした


私は同じことをしなければなりませんでしたが、なぜ最初に問題が発生したのかはわかりませんが、これでうまくいきます。
Jed Grant、

3
    public void Save(object entity)
    {
        using (var transaction = Connection.BeginTransaction())
        {
        try
                {
                    SaveChanges();
                    transaction.Commit();
                }
                catch (OptimisticConcurrencyException)
                {
                    if (ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Deleted || ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Modified)
                        this.Refresh(RefreshMode.StoreWins, entity);
                    else if (ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Added)
                        Detach(entity);
                    AcceptAllChanges(); 
                    transaction.Commit();
                }
        }
    }

「これ」がここで何を指しているのか、およびObjectStateManagerとは何かを明確にできますか?私はこれをベースリポジトリクラスで試していますが、エラーが発生します
Naomi

3

これは、一意の制約状況に挿入しようとしている場合にも発生します。つまり、雇用者ごとに1つのタイプのアドレスしか持てず、同じ雇用者に同じタイプの2つ目のアドレスを挿入しようとすると、同じ問題が発生します。 。

または

これは、割り当てられているすべてのオブジェクトプロパティに、以前と同じ値が割り当てられている場合にも発生する可能性があります。

        using(var db = new MyContext())
        {
            var address = db.Addresses.FirstOrDefault(x => x.Id == Id);

            address.StreetAddress = StreetAddress; // if you are assigning   
            address.City = City;                   // all of the same values
            address.State = State;                 // as they are
            address.ZipCode = ZipCode;             // in the database    

            db.SaveChanges();           // Then this will throw that exception
        }

2

edmxファイルに「関数インポート」へのマッピングを作成しようとすると、このエラーが発生する可能性があります。edmxの特定のエンティティのマッピングの詳細にある挿入、更新、削除のフィールドをクリアするだけで機能します。はっきりさせていただければ幸いです。


2

データベースに存在しないオブジェクトをアタッチすると、この例外が発生しました。オブジェクトは別のコンテキストから読み込まれると想定していましたが、ユーザーが初めてサイトにアクセスした場合は、オブジェクトは最初から作成されていました。自動インクリメントの主キーがあるので、

context.Users.Attach(orderer);

if (orderer.Id > 0) {
    context.Users.Attach(orderer);
}

2

まあ私はこれと同じ問題があります。しかし、これは私自身の過ちによるものでした。実際には、オブジェクトを追加するのではなく保存していました。つまり、これは対立でした。


2

Sql Server環境でこの問題をデバッグする1つの方法は、SqlServerのコピーに含まれているSql Profilerを使用することです。または、Expressバージョンを使用している場合、以下のリンクに従って、CodePlexからExpress Profilerのコピーを無料で入手できます。

エクスプレスプロファイラー

SQLプロファイラーを使用すると、EFからDBに送信されているものすべてにアクセスできます。私の場合、これは次のようになります:

exec sp_executesql N'UPDATE [dbo].[Category]
SET [ParentID] = @0, [1048] = NULL, [1033] = @1, [MemberID] = @2, [AddedOn] = @3
WHERE ([CategoryID] = @4)
',N'@0 uniqueidentifier,@1 nvarchar(50),@2 uniqueidentifier,@3 datetime2(7),@4 uniqueidentifier',
@0='E060F2CA-433A-46A7-86BD-80CD165F5023',@1=N'I-Like-Noodles-Do-You',@2='EEDF2C83-2123-4B1C-BF8D-BE2D2FA26D09',
@3='2014-01-29 15:30:27.0435565',@4='3410FD1E-1C76-4D71-B08E-73849838F778'
go

これをSQL Serverのクエリウィンドウにコピーして貼り付け、実行しました。案の定、実行されましたが、0件のレコードがこのクエリの影響を受けたため、EFからエラーが返されました。

私の場合、問題はCategoryIDが原因でした。

データベースに送信されたID EFによって識別されるCategoryIDがなかったため、影響を受けるレコードは0です。

これはEFのせいではありませんでしたが、バグのあるnullが合体して「??」ナンセンスをデータ層に送信していたビューコントローラーのステートメントを上に。


2

上記の答えはどれも私の状況とその解決策を完全にカバーしていません。

MVC5コントローラーでエラーがスローされたコード:

        if (ModelState.IsValid)
        {
            db.Entry(object).State = EntityState.Modified; 
            db.SaveChanges(); // line that threw exception
            return RedirectToAction("Index");
        }

編集ビューからオブジェクトを保存しているときにこの例外を受け取りました。それをスローした理由は、保存するために戻ったときに、オブジェクトの主キーを形成するプロパティを変更していたためです。したがって、状態を変更済みに設定しても、EFには意味がありません。これは、以前に保存されたものではなく、新しいエントリでした。

これを解決するには、A)オブジェクトを追加するために保存呼び出しを変更するか、B)編集時に主キーを変更しないでください。私はBをしました。


2

受け入れられた回答が「アプリケーションが発生したことを知らなかった変更を上書きすることにはならない言ったとき、オブジェクトが新しく作成されたため、私は懐疑的でした。しかし、結局のところ、INSTEAD OF UPDATE, INSERT- TRIGGER結局、同じテーブルの計算された列を更新しているテーブルにアタッチされていました。

これをに変更するとAFTER INSERT, UPDATE、問題なく動作しました。


2

これは、datetimeとdatetime2の不一致が原因で発生しました。不思議なことに、テスターが問題を発見する前に、それはうまくいきました。私のコードファーストモデルには、主キーの一部としてDateTimeが含まれていました。

[Key, Column(Order = 2)]  
public DateTime PurchasedDate { get; set; } = (DateTime)SqlDateTime.MinValue;

生成される列は日時列です。SaveChangesを呼び出すと、EFは次のSQLを生成しました。

-- Region Parameters
DECLARE @0 Int = 2
DECLARE @1 Int = 25
DECLARE @2 Int = 141051
DECLARE @3 DateTime2 = '2017-07-27 15:16:09.2630000' --(will not equal a datetime value)
-- EndRegion
UPDATE [dbo].[OrganizationSurvey]
SET [OrganizationSurveyStatusId] = @0
WHERE ((([SurveyID] = @1) AND ([OrganizationID] = @2)) AND ([PurchasedDate] = @3))

datetime列をdatetime2値と照合しようとしたため、結果は返されませんでした。私が考え得る唯一の解決策は、列をdatetime2に変更することでした:

[Key, Column(Order = 2, TypeName = "DateTime2")]  
public DateTime PurchasedDate { get; set; } = (DateTime)SqlDateTime.MinValue;

1
それが機能することと機能しないことの奇妙さは、datetimevs datetime2.の基礎となるフォーマット/ベースに関係しています。基本的に、一部のミリ秒の値は一致と評価され、他の値は一致しません。同じことが私にも起こり、私もに切り替えましたDateTime2
xr280xr

+1私はあなたのためにこれに+100ができることを望みます。私は多くの場所を調べた後、ようやくこれを見つけ、実際、主キーの一部として日時が含まれていることに気付きました。はい、これは確かにそれを修正しました。列をDatetime2に更新しましたが、うまくいきました。今、私の牛肉は、このためにそのようなくだらないクエリを考案するためのエンティティフレームワークであり、これは私にこれを強制します。
Catchops
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.