1

ばかげた質問のように聞こえるかもしれませんが、それについて知りたい側面があります。

データベースで自動生成される PrimaryKeys の Guid プロパティを持つオブジェクトを使用しています。私はEntity Framework、Code Firstを使用しています。保存する前にこのプロパティで Console.WriteLine を実行すると、値は
00000000-0000-0000-0000-000000000000.

コンテキストで Add と SaveChanges を使用した後Console.WriteLine、同じプロパティでもう一度実行すると、値が
615f98eb-4ced-422a-877f-b9caa6f2b91f になります。

明らかに、メモリ内のオブジェクトは更新されています。しかし、私は方法を知りたいです。GUID はデータベースで生成されます。

オブジェクトの Guid プロパティは単に EF を介してデータベースから更新されますか? それとも、データベースに保存した後、EF はオブジェクト全体をメモリに再読み込みしますか?

NUnit-tests同じプロジェクトでどのように設計するかが決まるので、知りたいです。

4

2 に答える 2

1

EF は、Insert/Update ステートメントを送信するだけでなく、同時に get ステートメントを実行して、生成された主キーを取得します。実際、これは 1 つのクエリです。エンティティの主キーは、取得したキーで更新されます。この背後に魔法はありません。

これも、バッチ更新/挿入がサポートされていない理由の 1 つです。すべてのエンティティは、独自に更新/挿入する必要があります。

これは、計算された int 主キーを持つエンティティを挿入するときに実行されるクエリです。

insert [dbo].[TestTable]
       ([Name])
values ('myname' /* @0 */)

select [ID]
from   [dbo].[TestTable]
where  @@ROWCOUNT > 0
       and [ID] = scope_identity()

ご覧のとおり、insert ステートメントの後には、計算列 (この場合は ID) を取得する select ステートメントが続きます。さらに計算された列がある場合、それらはすべてここで選択されます。

于 2013-03-07T08:28:00.443 に答える
1

domainContext.SaveChanges(); を呼び出すと、EF オブジェクトが更新されます。新しい Id は SQL データベースによって生成され、ID の値は DB からの戻り値です。int、Guid などのデータ型についても同様です。

于 2013-03-07T08:28:34.753 に答える