Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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#_Asp.net Core_Model View Controller_Repository Pattern_Generic Method - Fatal编程技术网

C# 我应该使用存储库模式来更新单个字段吗?如果是,怎么做?

C# 我应该使用存储库模式来更新单个字段吗?如果是,怎么做?,c#,asp.net-core,model-view-controller,repository-pattern,generic-method,C#,Asp.net Core,Model View Controller,Repository Pattern,Generic Method,我有大约10个控制器,它们有完全相同的方法,唯一改变的是表,它是从表中更新单个字段(前面解释得更好)。。。所以我在考虑在我的通用存储库接口上创建一个方法,用于 问题是,我实现这些方法的类不知道我们讨论的是什么表,所以我无法访问列,当然,列有不同的名称 更具体地说,我想更新记录的顺序。。如果我将记录从1放置到3,则会将这些记录的顺序从1更改为3。。这在所有表中都会发生,每个表作为一个名为OrderCompany或OrderCountry的字段,等等。。。既然我无法获取该字段,我该如何在存储库中进行

我有大约10个控制器,它们有完全相同的方法,唯一改变的是表,它是从表中更新单个字段(前面解释得更好)。。。所以我在考虑在我的通用存储库接口上创建一个方法,用于

问题是,我实现这些方法的类不知道我们讨论的是什么表,所以我无法访问列,当然,列有不同的名称

更具体地说,我想更新记录的顺序。。如果我将记录从1放置到3,则会将这些记录的顺序从1更改为3。。这在所有表中都会发生,每个表作为一个名为OrderCompany或OrderCountry的字段,等等。。。既然我无法获取该字段,我该如何在存储库中进行更新

我要更新的代码:

 [HttpPost]
        public async Task UpdateOrderAsync([FromBody] OrdemModel ordemObj)
        {
            using (var db = _context)
            {
                int ordemFinal = 0;

                //guardar item a ser movido
                var itemPegado = await _context.RH_Cargos.FindAsync(ordemObj.itemAMover);
                if (ordemObj.itemOndeFoi != 0)
                {
                    var itemFinal = await _context.RH_Cargos.FindAsync(ordemObj.itemOndeFoi);
                    ordemFinal = (int)itemFinal.OrdemCargos;
                }

                
                //update a todos os valores intermedios quando é para aumentar a ordem do item
                if (itemPegado.OrdemCargos < ordemFinal)
                {
                    var areas = db.RH_Cargos.Where(x => x.OrdemCargos > itemPegado.OrdemCargos & x.OrdemCargos <= ordemFinal).ToList();
                    areas.ForEach(o => o.OrdemCargos -= 1);
                }

                //update a todos os valores intermedio quando é para diminuir a ordem do item
                if (itemPegado.OrdemCargos > ordemFinal)
                {
                    ordemFinal++;
                    var areas = db.RH_Cargos.Where(x => x.OrdemCargos < itemPegado.OrdemCargos & x.OrdemCargos >= ordemFinal).ToList();
                    areas.ForEach(o => o.OrdemCargos += 1);

                }

                //guardar o item que se quis mover para o spot certo
                itemPegado.OrdemCargos = ordemFinal;

                //guardar
                db.SaveChanges();
            }
[HttpPost]
公共异步任务更新OrderAsync([FromBody]OrdeModel ordemObj)
{
使用(var db=\u上下文)
{
int-ordemFinal=0;
//guardar项目a ser movido
var itemPegado=wait_context.RH_Cargos.FindAsync(ordemObj.itemaover);
if(ordemObj.itemOndeFoi!=0)
{
var itemfail=wait_context.RH_Cargos.FindAsync(ordemObj.itemOndeFoi);
ordemFinal=(int)itemFinal.OrdemCargos;
}
//更新todos os valores intermedios quandoépara aumentar a ordem do项目
if(itemPegado.OrdemCargosx.OrdemCargos>itemPegado.OrdemCargos&x.OrdemCargos o.OrdemCargos-=1);
}
//更新一个todos os valores intermedio quandoépara diminuir a ordem do项目
如果(itemPegado.OrdemCargos>ordemFinal)
{
ordemFinal++;
var areas=db.RH_Cargos.Where(x=>x.OrdemCargos=ordemFinal.ToList();
ForEach(o=>o.OrdemCargos+=1);
}
//在现场证书上注明货物的位置
itemPegado.OrdemCargos=ordemFinal;
//瓜达尔
db.SaveChanges();
}

非常感谢您的帮助!谢谢:)

您可以使用Pogenerator(例如)要创建存储库类,每个存储库类都可以继承具有公共属性/方法的基类存储库,但这听起来是一个不应该过度抽象它的好例子。如果您有不同的表,并且正在更新不同的列,那么您正在做不同的事情,并且应该有清晰的显式代码这样做,而不是躲在一个被迫的抽象后面


否则,您可以使用许多模式,例如,但如果问题只是上面的代码,我会保持原样,看起来不太糟糕。

问题是,这种方法重复了很多次,我有8个控制器,唯一改变的是表和顺序字段名……所以我不应该创建一个通用方法吗?假设我想改变方法中的一个东西,现在我必须在10个不同的地方改变它……感觉很糟糕:/n如果你在模型类中使用一个接口怎么办?新版本的C#支持接口的默认实现。@Klamsi这是什么意思?你能给我一个简单的例子吗?(不需要上面的代码)公共类RH_Cargos:DbSet,ICanDoOrdering。在接口中,您需要订单列的名称,并为MoveToPos(元素,toIndex)添加默认实现我希望我正确地理解了你的问题。我想你理解了我的问题,但我不明白我该怎么做。所以我创建了一个接口,该接口的方法正确吗?在该接口中,我可以得到实体和列?然后呢?我只是在我的控制器上使用该方法?这有点奇怪。你能给我一个使用gen的例子吗eric更新给定表和给定字段的方法?在类似ORM的实体框架上使用“通用”存储库是一种反模式。现在您已经有了一个名为
\u context
的工作单元。DbContext是一个工作单元。您有一个存储库(名称奇怪)称为
RH_Cargos
。数据库集是一个存储库。如果最后不调用
SaveChanges
,所有更改都将被丢弃,这就是工作单元的工作方式。检查Gunnar Peipman的,即使您编写的存储库没有EF,您也需要清理此代码。它不会尝试更新单个字段,而是决定执行哪个查询基于某些参数。这些查询中的大多数可以替换为单个on。例如,您可以编写
if(someOption){query=query.Where(…);}
有条件地添加
Where
子句。或者您可以使用
if
或者甚至一个开关表达式来选择要与
Where
一起使用的
Func
第一个块可以替换为
RH_货物。其中(c=>someid.Contains(c.ID))。选择(c=>new{c.ID,c.OrdemCargos})
。这将生成
,其中ID位于(@id1,@id2…)
只加载相关字段而不是整行我读了很多书,以前我也读过,我不需要……但我也听到人们说我应该使用……这让我发疯,因为两边都有很多人,我对这一点很陌生……你在使用Id,我在任何地方都不使用Id,所以我当你说我应该用那个来替换我的第一个街区时我很困惑。。。