C# 基于实体框架上的其他列值设置列值
我有一个表包含两列,分别名为Id(IDENTITY(1,1))和OriginalId 当我们新添加一个实体时,OriginalId总是等于Id 要做到这一点,我必须编写这个愚蠢的代码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
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 isclass.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
也是最好的解决方案。