当前位置: 首页 > 面试题库 >

实体框架在db.SaveChanges()期间创建新的数据行

阎裕
2023-03-14
问题内容

根据本教程创建AngularJS应用程序:http : //jphoward.wordpress.com/2013/01/04/end-to-
end-web-app-in-under-an-hour/

类:

public class Todo
{
    public int ID { get; set; }
    public virtual Status Status { get; set; }
}

public class Status
{
    public int ID { get; set; }
    public string Type { get; set; }
}

功能是单击按钮并更改状态。单击该按钮时,所有正确的内容都将传递给Visual
Studio。最初它根本没有更新。经过一些研究,我发现了一些强制更改的方法,但是在db.SaveChanges()处,它向Status添加了一个新行,该行具有相同的“类型”,只是最后一个ID的增量ID。

调用update的JS:

Api.Todo.update({ id: todoID }, todo, function () {
    $location.path('/');
});

在此功能上打VS:

private DataContext db = new DataContext();

// PUT api/Todo/5
HttpResponseMessage PutTodo(int id, Todo todo)
{
    if (!ModelState.IsValid)
    {
        return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
    }

    if (id != todo.ID)
    {
        return Request.CreateResponse(HttpStatusCode.BadRequest);
    }

    // Found a stack overflow that mentioned that you need to check for things already being tracked
    var entry = db.Entry(todo);

    if (entry.State == EntityState.Detached)
    {
        var set = db.Set<Todo>();
        Todo attachedEntity = set.Find(todo.ID);  // You need to have access to key
        if (attachedEntity != null)
        {
            // The following code does not update any changes to the foreign keys
            var attachedEntry = db.Entry(attachedEntity);
            attachedEntry.CurrentValues.SetValues(todo);
            db.Entry(attachedEntity).State = EntityState.Modified;

            // When this didn't work, I tried just changing the status on the already attached entity
            //attachedEntity.Status = todo.Status;
            //db.SaveChanges();
            // However when it hit SaveChanges() it created a new row in the Status table.
        }
        else
        {
            //This code was never hit
            entry.State = EntityState.Modified; // This should attach entity
        }
    }

    try
    {
        db.SaveChanges();
    }
    catch (DbUpdateConcurrencyException ex)
    {
        return Request.CreateErrorResponse(HttpStatusCode.NotFound, ex);
    }

我的能力即将耗尽,希望能提供一些帮助或指导。


问题答案:
public class Todo
{
    public int ID { get; set; }

    //Foreign key
    public int StatusID { get; set; } //<====Add this line

    public virtual Status Status { get; set; }
}

发布数据时更新外键属性,而不是导航属性

另外,请检查以下内容:为什么实体框架将现有对象重新插入到我的数据库中? http://msdn.microsoft.com/zh-
CN/magazine/dn166926.aspx



 类似资料:
  • 我正在尝试初始化一个没有任何行的Data.Frame。基本上,我希望为每个列指定数据类型并命名它们,但不因此创建任何行。 到目前为止,我所能做的最好的事情是: 它创建了一个data.Frame,其中有一行包含我想要的所有数据类型和列名,但也创建了一个需要删除的无用行。 有没有更好的办法做到这一点?

  • 问题内容: 我正在尝试执行本教程http://www.asp.net/mvc/tutorials/getting-started-with-aspnet- mvc3/getting-started-with- mvc3-part4-cs, 但不是使用精简版的SQL Server我在本地计算机上使用完整安装。我阅读本教程的方式是,实体框架是根据我定义的对象创建表的。我的问题是,在运行项目时,我总是得

  • 我有一个带有“Status”布尔值的付款模型,该布尔值默认为false。付款后,我需要将特定付款的“状态”更新为true。 这是我一直试图用来更改特定数据库条目的代码,但它并没有改变它。我做错了什么? 谢谢 这就是最终起作用的原因:

  • 问题内容: 我们希望将当前日期时间放入数据库列中。 我们有一个Web场,Web服务器上的时间可以变化,因此我们需要在数据库服务器上使用datetime。 我们有一个带有datetime列的数据库。此列的默认日期时间为当前时间。 当我们使用不包含datetime列的SQL语句插入数据时,这种方法可以很好地工作。 从实体框架: 如果我们将datetime定义为,则datetime设置为低日期,并将低日

  • 防止在ASP.NET MVC中对使用属性的特定操作进行缓存 ASP.NET MVC如何禁用自动缓存选项?

  • 我有一个表,dateime的值是这样的 我想得到那一天或今天(现在是2021年12月8日)。因此,我尝试在控制器中使用EF: 但我还是没有弄明白。当我尝试调试DateTime时。今天日期,是指日期时间。今天={09/12/2021 00:00:00}。但当我尝试将createddate更新为“2021-12-09 00:00:00.000”时,它可以被检索。那么,如何检索我今天创建的行(忽略时间)