1

私はしばらくの間linq to sqlを使用してきましたが、このタイプの問題に遭遇することがよくあります....

例えば、私は 2 つの db テーブルを持っています

-テーブル: 請求書 ("Id" int auto-increment, "InvoiceDate" datetime)

-Table: InvoiceItems ("Id" int auto-increment, "InvoiceId" int (FK), "SomeReference" varchar(50))

"SomeReference" フィールドには、親の Invoice レコードの Id といくつかのランダムな文字を組み合わせた値が保持されます。例えば。「145AHTL」

SomeReference の値を設定する前に、請求書 ID の値を知る必要がありますが、これは DB に保存されたときにのみ入力されます。同じ Linq to SQl DB コンテキストに親レコードと子レコードの両方がありますが、子レコードに SomeReference を入力できるように、親請求書レコードに対してのみ「SubmitChanges」を実行したいだけです。SomeReference が設定される前に、子 InvoiceItem レコードを DB に保存したくありません。

Linq to Sql を使用してこれを達成するにはどうすればよいですか?

linq to sql がデータベースへの保存に「作業単位」のアイデアを使用していることは理解していますが、まだ保存する準備ができていないときにレコードを不必要にデータベースに保存することを避ける方法がわかりません。これを回避する方法がない場合、なぜ開発者はわざわざ linq to sql を使用するのでしょうか? これは非常に大きな欠点のように思えます。

編集:この例は、私の問題を説明するために私が思いついたものにすぎないことに注意してください。

4

2 に答える 2

1

それはいけません。この方法ではありません。これが唯一の方法です (linq dues はシーケンスをサポートしていません)。残酷に言えば、ロジックを修正する必要があります。請求書の ID は参照フィールドではありません。決して数字であってはなりません。これは論理フィールドであり、Id の外部でロジックによって処理される必要があります。

于 2013-01-06T18:12:37.803 に答える
1

例を実行することはできますが、SQL とデータベースを忘れる必要がありますが、ORM の方法で考えてください。

あなたの例では、2つの問題に対処する必要があります

最初にマスターとディテールを同時に挿入する

それがどのように機能するかの擬似コード:

using (var dc = new datacontext())

var master = new masterentity;
master.somedata = "data";
dc.tb_master.InsertOnSumbut(master)
var detail = new detailentity
detail.tb_master = master
dc.tb_detail.InsertOnSubmit(detail)
Submitchanges()

したがって、キーではなく、エンティティを相互に割り当てます。

2 番目: SomeReference

ただし、この最初の部分は somereference フィールドを提供せず、外部キーを適切に設定するだけです。

somereference フィールドには冗長データ (不要) が含まれているため、解決する必要があります。

somereference は文字列 + ID です。

したがって、文字列部分をデータベースの列に格納し (それのみ)、部分クラスを使用してカスタム プロパティ somereference を実装します。

  public partial class tb_detail
    {
        public string somereference
        {
             get
            {
               return _id.ToString() + _somestring;
}}}
于 2013-01-07T11:37:25.337 に答える