0

我有一个具有标识列的表,而另一列需要基于计算的标识列具有其值。

我的 EF 代码如下所示:

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

如果 ComputedColumn 是 IDENTITY 并且 Column1 是可为空的 varchar(50) 我希望 Column1 的值与 ComputedColumn 相同,但它为空。我什至试过这个:

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

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();

请记住,这是更大交易的一部分。我不想做的是完成交易,然后在单独的交易中进行另一次更新。我想把所有东西都放在一笔交易中。这之前一直在插入过程中工作。

谢谢,

布雷特

4

2 回答 2

0

ComputedColumn如果有,您的第二个和第三个示例应该可以工作DatabaseGeneratedOption.Identity。但是他们有单独的交易,这是你不想要的。

你的第一个例子行不通。当一列有时DatabaseGeneratedOption.Identity,EF 在执行时读回标识值SaveChanges。它不知道您可能试图传达的任何特殊指令

newTableRow.Column1 = newTableRow.ComputedColumn;

至于EF,它只是一个空值的赋值。

也许最好的选择是将计算列添加到您的数据库表中。你会用一块石头杀死两只鸟:

  • 它是事务性的,因为计算列只是重新显示标识列
  • 您可以防止冗余和可能的值冲突。
于 2013-01-21T09:38:51.443 回答
0

我刚刚查看了模型,你说得对,有一个我没有注意到的变化。Column1 已设置为计算值。删除该值应该可以解决问题。

于 2013-01-21T13:10:16.250 回答