0

自動インクリメントに設定されたIDがあります(明らかにint)。

var dc = new DataContext([STRING]);

var usersTable = dc.GetTable<Audit_User>();

var user = usersTable.FirstOrDefault(o => o.Username.Equals("NAME"));

if (user == null)
{
   user = new Audit_User()
   {
      Username = "NAME"
   };

   usersTable.InsertOnSubmit(user);
}

//HERE - I need access to the user Id

dc.SubmitChanges();

詳細については、タグを参照してください。

4

3 に答える 3

4

//ここ-ユーザーIDにアクセスする必要があります

実際にはありません。常にlinq-2-sqlを使用している場合は、user.idを設定してリレーションを設定する代わりに、ユーザーエンティティを割り当てることができます(IDが必要な最も可能性の高い原因)。

だからする代わりに

somerelated_table.fk_user_id = user.id

あなたがやる

somerelated_table.user = user

Linq-2-sqlは、SubmitChangesを呼び出すときに、user.idの適切な割り当てを処理します。さらに、ボーナスとして、すべてが1回のトランザクションで実行されます。それがlinq-2-sqlの美しさです。

linq-2-sqlを使用せずに操作するためにIDが必要な場合は、submitchangesの後でとにかくそれを行うことができ、とにかく問題にはなりません。

于 2012-10-04T20:09:52.510 に答える
1

IDはサーバー側で生成されるため、SQLサーバーにデータを送信する前にIDを取得することはできません。ひどくそうする必要がある場合は、クライアント側でIDを生成することをお勧めします(これは面倒かもしれません)。

もう1つの質問は、行を挿入する前にそのIDにアクセスする必要がある理由です。ほとんどの場合、linq2sqlがどのように機能するかを誤解している可能性があります。

テーブルのデータベースに外部キーが設定されていない場合があります。参照されるテーブルにIDを挿入するには、挿入直後にyourEntity.IDからIDを取得します。これは、システムによって入力される必要があります。変更を再度送信することを忘れないでください。

于 2012-10-04T13:47:46.060 に答える
0

さて、あなたのコードにuser.IDは、ユーザーIDが含まれています(以前に存在していた場合、そしてもちろん新しいものである場合)。それについてはよくわかりませんが、SubmitChangesは新しいレコードの新しいIDを自動的にクエリし、既存のオブジェクトIDプロパティを自動的に入力すると思います。したがって、user.IDを使用する場合は、後で使用する場合、追加のクエリの費用はかかりません。 SubmitChanges(新しいレコードで、SubmitChangesを呼び出さなかった場合は0になります)

ただし、SubmitChangesを呼び出す前にIDを使用する場合は、データベースに追加する前に「ID」を定義する最良の方法は、IDをデータベース(System.Guid)の一意の識別子にしてから、単にIDを挿入することです。 GUIDはINSERTステートメントですでに定義されています。

挿入が失敗する可能性があることに注意してください。その場合、何か問題が発生した場合、使用しているGuidと同じIDを持つユーザーが存在すると想定して行ったことがロールバックされることを確認する必要があります。

于 2012-10-04T13:54:30.067 に答える