代码之家  ›  专栏  ›  技术社区  ›  Zachary Scott

实体框架:如何更改实体中现有的整数外键值?

  •  2
  • Zachary Scott  · 技术社区  · 7 年前

    这应该是一个简单的实体框架6问题:如何将外键字段值从3更改为5并成功保存到Microsoft SQL Server数据库?我的代码成功地将其他字段保存在同一条记录中,但不会将外键字段值从3更改为5(保持为3,不会出错)

    更多信息:

    我在OrderLine和Product之间有一个嵌套关系,其中OrderLine是对Product的多对一关系(Product是父表,在OrderLine中可以为null)OrderLine有一个引用productid的整数外键字段。在此POCO中,实体框架在订单行中也有产品关系:

    public class OrderLine {
        public int orderid     {get;set;}
        public int productid   {get;set;} // Foreign Key to Product
        public int quantity    {get;set;}
        public Product product {get;set;} // generated by Entity Framework relation
    }
    public class Product {
        public int productid   {get;set;}
    }
    

    当我更改订单行时。如果将productid设置为其他值,则它不会保存该值,但会成功修改其他字段,如quantity。订单行为 EntityState.Modified 产品是 Unchanged (因为我们并没有修改产品,只是参考了不同的产品。)

    我错过了什么?我是否需要将实体框架产品关系设置为null以获取要保存的productid,或者下面的代码应该如何更改以允许保存?我只想更改productid值,而不是从数据库加载整个产品记录来更改id值。

    orderLine.productid = 5;
    orderLine.quantity = orderLine.quantity++;
    DbContext.Entry(orderLine).State = EntityState.Modified;
    DbContext.SaveChanges();
    // quantity increments by one and persists, productid stays 3.
    

    更新:

    当我添加代码以将产品关系设置为null时 product = null 保存前,成功保存并引用其他产品。我使用ASP。NET MVC数据绑定以获取 ICollection<OrderLine> orderLines 最初在控制器中。

    真奇怪。 Product product 未更改 所以我猜实体框架决定跳过productid字段,因为产品数据存在?将Product Product设置为null时,是否决定允许productid字段更改?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Daniel Lorenz    7 年前

    如果指向另一个FK对象,则需要更改Id并删除对导航对象的引用,或者必须同时更新Id和导航对象。然而,通常情况下,如果您更改其中一个而不是另一个,EF将对此引发异常。我想知道您是否关闭了该设置,比如您是否关闭了ValidateOnSaveEnabled?