Asp.netのEntity Frameworkに問題があります。オブジェクトをデータベースに追加するたびにId値を取得したい。これどうやってするの?
SaveChanges
、IDを取得するためだけにすぐに電話をかける必要がなくなります。詳細はこちら。
Asp.netのEntity Frameworkに問題があります。オブジェクトをデータベースに追加するたびにId値を取得したい。これどうやってするの?
SaveChanges
、IDを取得するためだけにすぐに電話をかける必要がなくなります。詳細はこちら。
回答:
とても簡単です。あなたはDBを使用している場合(のようなのIdsを生成したIDENTITY
あなただけにエンティティを追加する必要があるMS SQLでの)ObjectSet
およびSaveChanges
関連でObjectContext
。Id
自動的に入力されます:
using (var context = new MyContext())
{
context.MyEntities.Add(myNewObject);
context.SaveChanges();
int id = myNewObject.Id; // Yes it's here
}
エンティティフレームワークは、デフォルトINSERT
ではSELECT SCOPE_IDENTITY()
、自動生成されたId
が使用されるときにそれぞれ従います。
私はエンティティフレームワークを使用するときに、Idsを正常に取得するためにLadislav Mrnkaの回答を使用していました。人々は私が抱えていた問題を「解決」しようとしています。
Customerとの外部キー関係を持つOrderオブジェクトを考えてみます。新しい顧客と新しい注文を同時に追加したとき、私はこのようなことをしていました。
var customer = new Customer(); //no Id yet;
var order = new Order(); //requires Customer.Id to link it to customer;
context.Customers.Add(customer);
context.SaveChanges();//this generates the Id for customer
order.CustomerId = customer.Id;//finally I can set the Id
ただし、私の場合、customer.Idとorder.CustomerIdの間に外部キー関係があったため、これは必要ありませんでした。
私がしなければならなかったすべてはこれでした。
var customer = new Customer(); //no Id yet;
var order = new Order{Customer = customer};
context.SaveChanges();//adds customer.Id to customer and the correct CustomerId to order
変更を保存すると、顧客用に生成されたIDも注文に追加されます。追加の手順は必要ありません
これは元の質問に答えないことは承知していますが、EFに慣れていない開発者が、必要のないものに対して上位投票の回答を使いすぎないようにするのに役立つと考えました。
これは、更新が単一のトランザクションで完了することを意味し、orphinデータを回避する可能性があります(すべての更新が完了するか、まったく行われないかのいずれか)。
変更を保存した後、エンティティをリロードする必要があります。EFで追跡できないデータベーストリガーによって変更されたためです。したがって、DBからエンティティを再度リロードする必要があります。
db.Entry(MyNewObject).GetDatabaseValues();
その後
int id = myNewObject.Id;
以下の質問で@jayanthaの回答を見てください:
defaultValueを使用しているときに、エンティティフレームワークに挿入されたエンティティのIDを取得するにはどうすればよいですか?
以下の質問で@christianの回答を探すことも役立ちます:
.GetDatabaseValues();
モデルをDBに保存しただけの場合は、何もする必要はありません。IDはモデルに自動的に再入力されます。
GetDatabaseValues()
データベースで検索するオブジェクトのIDがわからない場合はどうすればよいでしょうか。
こちらのリンクをご参照ください。
http://www.ladislavmrnka.com/2011/03/the-bug-in-storegeneratedpattern-fixed-in-vs-2010-sp1/
StoreGeneratedPatternのプロパティをidentityに設定してから、独自のコードを試す必要があります。
または、これも使用できます。
using (var context = new MyContext())
{
context.MyEntities.AddObject(myNewObject);
context.SaveChanges();
int id = myNewObject.Id; // Your Identity column ID
}
StoreGeneratedPattern
私にとって欠けていた部分でした。
保存後にのみIDを取得できます。代わりに、新しいGuidを作成して、保存する前に割り当てることができます。
データベースにデータを挿入する必要があり、同時にエンティティフレームワークを使用してプライマリIDが必要な状況に遭遇しました。解決 :
long id;
IGenericQueryRepository<myentityclass, Entityname> InfoBase = null;
try
{
InfoBase = new GenericQueryRepository<myentityclass, Entityname>();
InfoBase.Add(generalinfo);
InfoBase.Context.SaveChanges();
id = entityclassobj.ID;
return id;
}
すべての答えはそれぞれのシナリオに非常に適しています。私が違ったのは、Add()がこのようなint変数に返したオブジェクト(TEntity)から直接int PKを割り当てたことです。
using (Entities entities = new Entities())
{
int employeeId = entities.Employee.Add(new Employee
{
EmployeeName = employeeComplexModel.EmployeeName,
EmployeeCreatedDate = DateTime.Now,
EmployeeUpdatedDate = DateTime.Now,
EmployeeStatus = true
}).EmployeeId;
//...use id for other work
}
新しいオブジェクト全体を作成するのではなく、必要なものだけを取得します。
@GertArnold氏の編集:
Add
(これがそうである場合DbSet.Add
)魔法のように値をに割り当てないことEmployeeId
です。
SaveChanges
。無理だよ。EmployeeId
たとえばEmployee
のコンストラクターなど、を割り当てる他のプロセスがない限り。または、を使用してEFコアを使用していForSqlServerUseSequenceHiLo
ます。とにかく、全体像を示しているわけではありません。
Repository.addorupdate(entity, entity.id);
Repository.savechanges();
Var id = entity.id;
これは機能します。
Repository
は完全に不明確です。そして、「これでうまくいく」というのは説明です!。
2つの戦略があります。
データベース生成ID
(int
またはGUID
)を使用する
短所:
保存したエンティティのSaveChanges()
を取得するID
ために実行する必要があります。
長所:
int
IDを使用できます。
生成されたクライアントを使用ID
-GUIDのみ。
長所:SaveChanges
運用の縮小。1回の操作で新しいオブジェクトの大きなグラフを挿入できます。
短所:
のみ許可 GUID
最初にEF 6.xコードを使用する場合
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
データベーステーブルを初期化すると、
(newsequentialid())
ヘッダーの[Default Value]または[Binding]の下のテーブルプロパティ内で、挿入時にIDを入力できます。
問題は、テーブルを作成して、
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
後で、将来の更新データベースは(newsequentialid())を追加しません
適切な方法を修正するには、移行をワイプしてデータベースを削除してから再移行します...または、(newsequentialid())をテーブルデザイナーに追加するだけです。
when -column- is NULL, then NEWID()