EF 5.0将列设置为等于一个事务中另一列的默认(计算)值

时间:2013-01-20 14:30:45

标签: entity-framework

我有一个具有Identity列的表,另一列需要根据计算出的identity列获取其值。

我的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相同,但它是null。 我甚至试过这个:

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

请记住,这是较大交易的一部分。我不想做的是完成事务,然后在另一个事务中做另一次更新。我想在一次交易中保留所有内容。这之前一直在插入过程中。

谢谢,

布雷特

2 个答案:

答案 0 :(得分:0)

如果ComputedColumnDatabaseGeneratedOption.Identity,那么您的第二个例子应该有效。但他们有单独的交易,你不需要。

你的第一个例子不起作用。当列具有DatabaseGeneratedOption.Identity时,EF会在执行SaveChanges时读取标识值。它不知道您可能尝试用

传达的任何特殊指令
newTableRow.Column1 = newTableRow.ComputedColumn;

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

也许最好的选择是在数据库表中添加computed column。你将一石二鸟:

  • 这是事务性的,因为计算列只是重新显示标识列
  • 您可以防止冗余和可能的价值冲突。

答案 1 :(得分:0)

我刚刚审核了模型,你说得对,我没有注意到。 Column1已设置为计算值。删除该值应该可以解决问题。