Asp.net mvc 保存更改不设置值,而是选择现有值

Asp.net mvc 保存更改不设置值,而是选择现有值,asp.net-mvc,entity-framework,entity-framework-6,Asp.net Mvc,Entity Framework,Entity Framework 6,当尝试将修改后的条目提交到数据库时,EntityFramework为两个属性选择值,而不是设置它们 将实体提交到数据库的代码如下: [HttpPost] [ValidateAntiForgeryToken] public ActionResult Edit(Till till) { if (ModelState.IsValid) { string username = User.Identity.Name.Substring(User.Identity.Name.

当尝试将修改后的条目提交到数据库时,EntityFramework为两个属性选择值,而不是设置它们

将实体提交到数据库的代码如下:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(Till till)
{
    if (ModelState.IsValid)
    {
        string username = User.Identity.Name.Substring(User.Identity.Name.LastIndexOf('\\') + 1);

        till.ModifiedDate = DateTime.Now;
        till.ModifiedByUid_FK = db.Users.Where(m => m.Name.ToLower() == username.ToLower()).First().UserUid_PK;

        db.Entry(till).State = EntityState.Modified;
        db.SaveChanges();

        return RedirectToAction("Index/" + (int)Session["siteid"]);
    }
    ViewBag.SiteUid_FK = new SelectList(db.Sites, "SiteUid_PK", "Name", till.SiteUid_FK);
    ViewBag.ModifiedByUid_FK = new SelectList(db.Users, "UserUid_PK", "EHLogin", till.ModifiedByUid_FK);
    ViewBag.CreatedByUid_FK = new SelectList(db.Users, "UserUid_PK", "EHLogin", till.CreatedByUid_FK);
    return View(till);
}
在探查器中查看时,如下所示:

exec sp_executesql N'update [dbo].[Till]
set [NetworkId] = @0, [MID] = @1, [SiteUid_FK] = @2, [Location] = null, [MasterTillNo] = @3,
    [IsMaster] = @4, [IsBackOffice] = @5, [IsCurrent] = @6, [ModifiedByUid_FK] = @7, 
    [CreatedByUid_FK] = @8, [ProcessFiles] = @9
where ([TillUid_PK] = @10)
select [ModifiedDate], [CreatedDate]
from [dbo].[Till]
where @@ROWCOUNT > 0 and [TillUid_PK] = @10',N'@0 varchar(50),@1 int,@2 int,@3 int,@4 bit,@5 bit,@6 
    bit,@7 int,@8 int,@9 bit,@10 int',
    @0='',@1='',@2=4,@3=42,@4=1,@5=0,@6=1,@7=4,@8=1,@9=1,@10=699
我猜EF用来确定这个功能的数据库中的字段有一些属性,但我不知道它是什么。如果有人有任何信息,那就太棒了:)


编辑1 使用下面Ibrahim的答案,可以得到相对类似的SQL:

exec sp_executesql N'declare @p int
update [dbo].[Till]
set @p = 0
where ([TillUid_PK] = @0)
select [ModifiedDate], [CreatedDate]
from [dbo].[Till]
where @@ROWCOUNT > 0 and [TillUid_PK] = @0',N'@0 int',@0=687

我在以下方面也遭遇了厄运:

db.Entry(entity).State = EntityState.Modified;
因此,我建议尝试以下操作:

//Get the existing Till
var existingTill = db.Tills.Find(till.TillId);

//Save changes for only changed properties
db.Entry(existingTill).CurrentValues.SetValues(till);
db.SaveChanges();

我在以下方面也遭遇了厄运:

db.Entry(entity).State = EntityState.Modified;
因此,我建议尝试以下操作:

//Get the existing Till
var existingTill = db.Tills.Find(till.TillId);

//Save changes for only changed properties
db.Entry(existingTill).CurrentValues.SetValues(till);
db.SaveChanges();

我在以下方面也遭遇了厄运:

db.Entry(entity).State = EntityState.Modified;
因此,我建议尝试以下操作:

//Get the existing Till
var existingTill = db.Tills.Find(till.TillId);

//Save changes for only changed properties
db.Entry(existingTill).CurrentValues.SetValues(till);
db.SaveChanges();

我在以下方面也遭遇了厄运:

db.Entry(entity).State = EntityState.Modified;
因此,我建议尝试以下操作:

//Get the existing Till
var existingTill = db.Tills.Find(till.TillId);

//Save changes for only changed properties
db.Entry(existingTill).CurrentValues.SetValues(till);
db.SaveChanges();

当属性具有数据注释时,通常会发生这种情况

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
还是流畅的映射

.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed)
或者在edmx文件中计算
StoreGeneratedPattern


我猜数据库中的列上的
ModifiedDate
CreatedDate
上都有一个触发器或默认值。也许在应用程序代码中设置它们甚至是无用的。

当属性具有数据注释时,通常会发生这种情况

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
还是流畅的映射

.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed)
或者在edmx文件中计算
StoreGeneratedPattern


我猜数据库中的列上的
ModifiedDate
CreatedDate
上都有一个触发器或默认值。也许在应用程序代码中设置它们甚至是无用的。

当属性具有数据注释时,通常会发生这种情况

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
还是流畅的映射

.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed)
或者在edmx文件中计算
StoreGeneratedPattern


我猜数据库中的列上的
ModifiedDate
CreatedDate
上都有一个触发器或默认值。也许在应用程序代码中设置它们甚至是无用的。

当属性具有数据注释时,通常会发生这种情况

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
还是流畅的映射

.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed)
或者在edmx文件中计算
StoreGeneratedPattern



我猜数据库中的列上的
ModifiedDate
CreatedDate
上都有一个触发器或默认值。也许在应用程序代码中设置它们甚至是无用的。

通常,您需要查找实体,用发布的模型中的值更新这些值,然后执行更新。我没见过你这样做-我甚至不确定它是否会工作,但它肯定是不可取的。这是ASP.NET MVC的“开箱即用”方式:),我不明白为什么它是错的,你能解释一下吗?除了它不工作之外?首先,您不应该在视图中公开数据实体。我不认为这是错误的,我要求您解释一下。当我明显不明白的时候,告诉我这是错误的,而不告诉我为什么是错误的,这是没有建设性的。我并没有说这是错误的,我只是说我以前从未见过这样的更新。不管怎样,@Ibrahim给出的答案就是这样做的。通常,您会查找实体,用发布的模型中的值更新值,然后执行更新。我没见过你这样做-我甚至不确定它是否会工作,但它肯定是不可取的。这是ASP.NET MVC的“开箱即用”方式:),我不明白为什么它是错的,你能解释一下吗?除了它不工作之外?首先,您不应该在视图中公开数据实体。我不认为这是错误的,我要求您解释一下。当我明显不明白的时候,告诉我这是错误的,而不告诉我为什么是错误的,这是没有建设性的。我并没有说这是错误的,我只是说我以前从未见过这样的更新。不管怎样,@Ibrahim给出的答案就是这样做的。通常,您会查找实体,用发布的模型中的值更新值,然后执行更新。我没见过你这样做-我甚至不确定它是否会工作,但它肯定是不可取的。这是ASP.NET MVC的“开箱即用”方式:),我不明白为什么它是错的,你能解释一下吗?除了它不工作之外?首先,您不应该在视图中公开数据实体。我不认为这是错误的,我要求您解释一下。当我明显不明白的时候,告诉我这是错误的,而不告诉我为什么是错误的,这是没有建设性的。我并没有说这是错误的,我只是说我以前从未见过这样的更新。不管怎样,@Ibrahim给出的答案就是这样做的。通常,您会查找实体,用发布的模型中的值更新值,然后执行更新。我没见过你这样做-我甚至不确定它是否会工作,但它肯定是不可取的。这是ASP.NET MVC的“开箱即用”方式:),我不明白为什么它是错的,你能解释一下吗?除了它不工作之外?首先,您不应该在视图中公开数据实体。我不认为这是错误的,我要求您解释一下。当我明显不明白的时候,告诉我这是错误的,而不告诉我为什么是错误的,这是没有建设性的。我并没有说这是错误的,我只是说我以前从未见过这样的更新。不管怎样,@Ibrahim给出的答案是这样做的。这种方法是否也要求您将实体的状态更改为修改?不。只要在您的操作中使用上面的代码,它就会工作。相同的区别是,它仍然从表中选择两个日期字段。请注意,选择之前有一个更新。检查记录是否正确