0

I have a table that has an Identity column and another column needs to have its value based on the computed identity column.

My EF code looks like this:

var context = new DBEntities();
var newTableRow = new TableRow();
newTableRow.Column1 = newTableRow.ComputedColumn;
context.TableRows.Add(newTableRow);
context.SaveChanges();

If ComputedColumn is an IDENTITY and Column1 is a nullable varchar(50) I would expect the value of Column1 to be the same as the ComputedColumn but it is null. I have even tried this:

var context = new DBEntities();
var newTableRow = new TableRow();
context.TableRows.Add(newTableRow);
context.SaveChanges();
newTableRow.Column1 = newTableRow.ComputedColumn;
context.SaveChanges();

AND

var context = new DBEntities();
var newTableRow = new TableRow();
context.TableRows.Add(newTableRow);
context.SaveChanges();
var getTableRow = context.TableRows.Single(r => r.ComputedColumn == newTableRow.ComputedColumn);
getTableRow.Column1 = newTableRow.ComputedColumn.ToString();
context.SaveChanges();

Keep in mind that this is part of a larger transaction. What I don't want to do is complete the transaction then in a separate transaction do another update. I would like to keep everything in one transaction. This had been working in an insert proc before.

Thanks,

Brett

4

2 に答える 2

0

モデルを確認したところ、気付かなかった変更があったことは間違いありません。Column1 は計算値として設定されていました。その値を削除すると、問題が解決するはずです。

于 2013-01-21T13:10:16.250 に答える
0

2 番目の 3 番目の例は、ComputedColumnhasの場合に機能するはずDatabaseGeneratedOption.Identityです。しかし、それらには別のトランザクションがあり、これは望ましくありません。

最初の例は機能しません。列に がある場合DatabaseGeneratedOption.Identity、EF は実行時に ID 値を読み取りますSaveChanges。あなたが伝えようとしたかもしれない特別な指示を認識していません

newTableRow.Column1 = newTableRow.ComputedColumn;

EFに関しては、空の値を持つ単なる代入です。

おそらく最良の代替手段は、データベース テーブルに計算列を追加することです。あなたは一石二鳥だ。

  • 計算列は ID 列を再表示するだけなので、トランザクションです。
  • 冗長性と値の競合の可能性を防ぎます。
于 2013-01-21T09:38:51.443 に答える