Asp.net core 从ASP.NET Core 2.2更新SQL Server中的上下文

Asp.net core 从ASP.NET Core 2.2更新SQL Server中的上下文,asp.net-core,Asp.net Core,当我使用此代码时,SQL Server会添加一条新记录,而不是更新 当前上下文 _context.Update(v) ; _context.SaveChanges(); [HttpPost] 公共IActionResult页面投票(列表Sar) { 字符串名称_voter=ViewBag.getValue=TempData[“Namevalue”]; 整数计数=0; foreach(Sar中的var项目) { 计数=计数+1; } 如果(计数=6) { 投票v=新的投票() { VoteSar

当我使用此代码时,SQL Server会添加一条新记录,而不是更新 当前上下文

_context.Update(v) ;
_context.SaveChanges();
[HttpPost]
公共IActionResult页面投票(列表Sar)
{
字符串名称_voter=ViewBag.getValue=TempData[“Namevalue”];
整数计数=0;
foreach(Sar中的var项目)
{
计数=计数+1;
}
如果(计数=6)
{
投票v=新的投票()
{
VoteSarparast1=Sar[0],
VoteSarparast2=Sar[1],
VoteSarparast3=Sar[2],
VoteSarparast4=Sar[3],
VoteSarparast5=Sar[4],
VoteSarparast6=Sar[5],
};
var voter=\u context.vows.FirstOrDefault(u=>u.voter==name\u voter&&u.isvote==true);
如果(投票者==null)
{
v、 IsVoted=true;
v、 选民=姓名\选民;
_增加(v);
_SaveChanges();
ViewBag.Greeting=“ایش㶎㶎موقی㶬㶬ش”;
返回重定向到操作(name of(end));
}
v、 IsVoted=true;
v、 选民=姓名\选民;
_更新(五);
_SaveChanges();
返回重定向到操作(name of(end));
}
其他的
{
返回视图(_context.applicators.ToList());
}
}

您需要告诉
DbContext
您的实体。如果您执行
var-vote=new-vote()
vote
则没有
Id
DbContext
看到这一点,认为您想要添加一个新实体,所以它只是简单地这样做。
DbContext
跟踪您从中加载的所有实体,但由于这只是一个新实例,它对此一无所知

要实际执行更新,您有两个选项:

1-以某种方式从数据库加载
投票
;如果你有一个Id,用它来找到它

[HttpPost]
public IActionResult PageVote(List<string> Sar)
{
    string name_voter = ViewBag.getValue = TempData["Namevalue"];

    int count = 0;

    foreach (var item in Sar)
    {
        count = count + 1;
    }

    if (count == 6)
    {
        Vote v = new Vote()
                 {
                    VoteSarparast1 = Sar[0],
                    VoteSarparast2 = Sar[1],
                    VoteSarparast3 = Sar[2],
                    VoteSarparast4 = Sar[3],
                    VoteSarparast5 = Sar[4],
                    VoteSarparast6 = Sar[5],
                 };

        var voter = _context.Votes.FirstOrDefault(u => u.Voter == name_voter && u.IsVoted == true);

        if (voter == null)
        {
            v.IsVoted = true;
            v.Voter = name_voter;
            _context.Add(v);
            _context.SaveChanges();

            ViewBag.Greeting = "رای شما با موفقیت ثبت شد";
            return RedirectToAction(nameof(end));
        }

        v.IsVoted = true;
        v.Voter = name_voter;

        _context.Update(v);
        _context.SaveChanges();

        return RedirectToAction(nameof(end));
    }
    else
    {
        return View(_context.Applicants.ToList());
    }
}
2-或者,如果您不想从数据库加载它,您必须手动告诉
DbContext
该怎么做:

// Loads the current vote by its id (or whatever other field..)
var existingVote = context.Votes.Single(p => p.Id == id_from_param);

// Perform the changes you want..
existingVote.SomeField = "NewValue";                

// Then call save normally.
context.SaveChanges();
这两种方法中的任何一种都可以解决您的问题,但我建议您多读一点关于实体框架如何工作的内容。这对于应用程序的成功(和性能)至关重要。尤其是上面的
选项2
可能会导致许多问题。
DbContext
跟踪实体是有原因的,因此您不必这样做。这很复杂,事情很快就会恶化

为您提供一些链接:

欢迎来到SO:)。我们需要更多的代码来帮助您。特别是,
v
来自哪里?它是一个参数吗?您面临的问题是:
DbContext
没有意识到
v
,这意味着它没有跟踪它。当你调用
Update
时,它会在内部检查并说:哼。。我不认识这个人,所以我最好插进去。要修复此问题,必须首先加载它,然后调用
Update
.public DatabaseContext(DbContextOptions):base(options){}public DbSet角色{get;set;}public DbSet用户{get;set;}public DbSet投票{get;set;}public DbSet申请者{get;set;}}///公共HomeController(DatabaseContext上下文){{u context=context;}……///投票v=新投票(){..}这就是为什么。v是一个新的实例,DbContext无法在您不告诉它的情况下更新它。另外,v必须有一个Id,以便DbContext可以找到它。请将代码放在您的问题中,不要放在注释中,因为它很难阅读。_context.SaveChanges()跟踪所有更改,当对实体进行更改时,不需要调用_context.Update(),_context.SaveChanges()是有效的,您的实体将被更新,请通知@reza.nadrian,如果我的回答有助于您解决问题,请确保将其标记为已接受。这就是你用虚假的互联网积分“谢谢我”的方式D
// create a new "vote"...
var vote = new Vote
{
    // Since it's an update, you must have the Id somehow.. so you must set it manually
    Id = id_from_param,

    // do the changes you want. Be careful, because this can cause data loss!
    SomeField = "NewValue"
};

// This is you telling the DbContext: Hey, I control this entity. 
// I know it exists in the DB and it's modified
context.Entry(vote).State = EntityState.Modified;

// Then call save normally.
context.SaveChanges();