Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于实体框架上的其他列值设置列值_C#_Entity Framework - Fatal编程技术网

C# 基于实体框架上的其他列值设置列值

C# 基于实体框架上的其他列值设置列值,c#,entity-framework,C#,Entity Framework,我有一个表包含两列,分别名为Id(IDENTITY(1,1))和OriginalId 当我们新添加一个实体时,OriginalId总是等于Id 要做到这一点,我必须编写这个愚蠢的代码 MyClass obj = new MyClass() _repo.Add(obj); obj.OriginalId = obj.Id; _repo.Update(obj) 这个需要写入数据库2次。有没有办法让它只写一次OriginalId=Id 关于,如果您的obj.id是自动递增的,在将新的o

我有一个表包含两列,分别名为Id(IDENTITY(1,1))和OriginalId

当我们新添加一个实体时,OriginalId总是等于Id

要做到这一点,我必须编写这个愚蠢的代码

  MyClass obj = new MyClass()
  _repo.Add(obj);
  obj.OriginalId = obj.Id;
  _repo.Update(obj)
这个需要写入数据库2次。有没有办法让它只写一次OriginalId=Id
关于,

如果您的
obj.id
是自动递增的,在将新的
obj
添加到存储库之前,请尝试在
\u repo
中获取最新的
id
。这样做:

MyClass obj = new MyClass();

var latestId = _repo.GetLatestId();
obj.OriginalId = ++latestId;

_repo.Add(obj);
MyClass obj = new MyClass();

obj.id = Guid.NewGuid();
obj.OriginalId = obj.id;

_repo.Add(obj);
但是,如果不想两次访问存储库,则需要更改表方案。您的
id
不应自动递增,您需要自己生成
id
,或者您可以使用方法生成唯一的
id
。在这种情况下,请尝试以下操作:

MyClass obj = new MyClass();

var latestId = _repo.GetLatestId();
obj.OriginalId = ++latestId;

_repo.Add(obj);
MyClass obj = new MyClass();

obj.id = Guid.NewGuid();
obj.OriginalId = obj.id;

_repo.Add(obj);

如果您的
obj.id
是自动递增的,则在将新的
obj
添加到存储库之前,请尝试在
\u repo
中获取最新的
id
。这样做:

MyClass obj = new MyClass();

var latestId = _repo.GetLatestId();
obj.OriginalId = ++latestId;

_repo.Add(obj);
MyClass obj = new MyClass();

obj.id = Guid.NewGuid();
obj.OriginalId = obj.id;

_repo.Add(obj);
但是,如果不想两次访问存储库,则需要更改表方案。您的
id
不应自动递增,您需要自己生成
id
,或者您可以使用方法生成唯一的
id
。在这种情况下,请尝试以下操作:

MyClass obj = new MyClass();

var latestId = _repo.GetLatestId();
obj.OriginalId = ++latestId;

_repo.Add(obj);
MyClass obj = new MyClass();

obj.id = Guid.NewGuid();
obj.OriginalId = obj.id;

_repo.Add(obj);

什么是class.Id?它不应该是
obj.id
?创建一个函数来执行一次
YourFunction(class.id)
如果需要更好的结果,编码需要更多的耐心。在SQL表上创建一个insert触发器,每次插入新数据时,它都会更新
OriginalId
值。@Virustrity:您是正确的。对不起,我打错了@reds:我不明白你的意思。你能说清楚一点吗?@谢谢你的建议。我想在使用触发器之前找到在EF中解析它的方法。请尝试使用计算字段:What is
class.Id
?它不应该是
obj.id
?创建一个函数来执行一次
YourFunction(class.id)
如果需要更好的结果,编码需要更多的耐心。在SQL表上创建一个insert触发器,每次插入新数据时,它都会更新
OriginalId
值。@Virustrity:您是正确的。对不起,我打错了@reds:我不明白你的意思。你能说清楚一点吗?@谢谢你的建议。我想在使用触发器之前找到在EF中解决它的方法。尝试计算字段:谢谢你的解决方案,但是,这一个仍然访问数据库2次(一次获取LastTestID,一次添加数据),而且,如果删除了最后一条记录(假设Id=1000)。那么新的最后一条记录的Id=999。如果我们使用您的解决方案,Id将是1001,OriginalId将是1000个问候,@wraith这是真的,但我认为您别无选择。然而,在这个解决方案中,您不需要更新整个对象(具有高性能成本),只需要得到一个整数值(具有低性能成本)。然后你将整个对象添加到存储库。@wraith你还有另外两个解决方案,由
Masoud Darvishian
。您可以将“自动增量”设置为false,并自行添加Id。两者都有。那你就不会面对这个问题了。使用
GUID
也是最好的解决方案。感谢您提供的解决方案。不过,如果删除了最后一条记录(假设Id=1000),该解决方案仍然会访问数据库2次(一次获取LastTestID,一次添加数据)。那么新的最后一条记录的Id=999。如果我们使用您的解决方案,Id将是1001,OriginalId将是1000个问候,@wraith这是真的,但我认为您别无选择。然而,在这个解决方案中,您不需要更新整个对象(具有高性能成本),只需要得到一个整数值(具有低性能成本)。然后你将整个对象添加到存储库。@wraith你还有另外两个解决方案,由
Masoud Darvishian
。您可以将“自动增量”设置为false,并自行添加Id。两者都有。那你就不会面对这个问题了。使用
GUID
也是最好的解决方案。