Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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# 附加和保存时未更新实体框架6外键_C#_Sql Server_Sql Update_Entity Framework 6_Foreign Key Relationship - Fatal编程技术网

C# 附加和保存时未更新实体框架6外键

C# 附加和保存时未更新实体框架6外键,c#,sql-server,sql-update,entity-framework-6,foreign-key-relationship,C#,Sql Server,Sql Update,Entity Framework 6,Foreign Key Relationship,当我尝试更新实体对象时,entity framework 6没有更新外键存在问题。它可以在insert上工作,但是我必须将状态设置为“未更改”,以便不在外键表中重新插入新实体。我使用代码优先的方法,自己生成模型。这是一个web应用程序,所以实体对象被分离,所以我必须重新连接它们 我创建了一个简化的示例,因此很容易解释我的问题是什么。在这个例子中,我有一个car对象,它有一个一对多的关系。我想更新一辆车,改变它的品牌和名称。将更新名称,但不会更新外键值。我如何继续更新外键 处理附加数据的代码 pu

当我尝试更新实体对象时,entity framework 6没有更新外键存在问题。它可以在insert上工作,但是我必须将状态设置为“未更改”,以便不在外键表中重新插入新实体。我使用代码优先的方法,自己生成模型。这是一个web应用程序,所以实体对象被分离,所以我必须重新连接它们

我创建了一个简化的示例,因此很容易解释我的问题是什么。在这个例子中,我有一个car对象,它有一个一对多的关系。我想更新一辆车,改变它的品牌和名称。将更新名称,但不会更新外键值。我如何继续更新外键

处理附加数据的代码

public void UpdateCars(Car car){
    var dbContext = new CarsDbContext(); //Inherits DbContext
    dbContext.Cars.Attach(car);
    dbContext.Entry(car).State = EntityState.Modified;
    dbContext.SaveChanges();
}
汽车实体

[Table("Car")]
public class Car
{
    public Guid Id { get; set; }

    public String Name { get; set; }

    public virtual Make Make { get; set; }
}

[Table("Make")]
public class Make
{
    public Guid Id { get; set; }

    public String Name { get; set; }
}
编辑:

在评论的帮助下,我做了更多的修改,谢谢大家!我做了一些工作,但感觉我做得不对,因为代码很不漂亮。以下是我所做的:

将汽车对象修改为:

    public String Name { get; set; }

    public Guid Make_Id

    [ForeignKey("Make_Id")]
    public virtual Make Make { get; set; }
在我的更新中

    var dbContext = new CarsDbContext(); //Inherits DbContext
    car.Make_Id = car.Make.Id;
    dbContext.Cars.Attach(car);

在使用分离的实体时,首先执行EF代码时,肯定有更好的做法可以解决这个问题。

我最终使用了graphdiff,解决了我所有的问题。同样,当我的实体变得更复杂时,它多次尝试攻击同一个实体。这里有一篇文章可以阅读:

您是否也尝试过附加和设置Make实体的状态,我怀疑这会起作用。您的Car对象是否真的没有外键.Id的属性,或者您是否为了简洁而省略了它?@BenRobinson感谢您的建议,但遗憾的是它没有起作用。我尝试过:dbContext.Makes.Attachcar.Make;dbContext.Entrycar.Make.State=EntityState.Modified;不work@ArneHB,这需要在汽车对象上声明一个属性,如public Guid MakeId{get;set;}。virtual关键字允许EF连接延迟加载和更改跟踪。这就是全部。