gpt4 book ai didi

c# - 使用 EF 更新 PK 时出错

转载 作者:行者123 更新时间:2023-11-30 12:51:42 25 4
gpt4 key购买 nike

我正在尝试使用 EF 4.1 (POCO) 在 Northwind 数据库的 Order_Details 表中进行更新。该表定义为:

[MetadataType(typeof(Order_DetailMetadata))]
public partial class Order_Detail
{
public int OrderID { get; set; }
public int ProductID { get; set; }
public decimal UnitPrice { get; set; }
public short Quantity { get; set; }
public float Discount { get; set; }

public virtual Order Order { get; set; }
public virtual Product Product { get; set; }
}

public class Order_DetailMetadata
{
[Key]
[Required]
[DisplayNameLocalized("Model_OrderDetail_OrderID_DisplayName")]
public int OrderID { get; set; }

[Key]
[Required]
[DisplayNameLocalized("Model_OrderDetail_ProductID_DisplayName")]
public int ProductID { get; set; }

[Required]
[Range(0.00, 9999.99, ErrorMessageResourceType = typeof(Messages), ErrorMessageResourceName = "Model_Range_Float_Error")]
[DisplayNameLocalized("Model_OrderDetail_UnitPrice_DisplayName")]
public decimal UnitPrice { get; set; }

[Required]
[Range(1, short.MaxValue, ErrorMessageResourceType = typeof(Messages), ErrorMessageResourceName = "Model_Range_Integer_Error")]
[DisplayNameLocalized("Model_OrderDetail_Quantity_DisplayName")]
public short Quantity { get; set; }

[Required]
[DisplayNameLocalized("Model_OrderDetail_Discount_DisplayName")]
[Range(0.00, 1.00, ErrorMessageResourceType = typeof(Messages), ErrorMessageResourceName = "Model_Range_Float_Error")]
public float Discount { get; set; }
}

问题是,当我尝试用新产品更新 OrderDetail 项目时,出现异常:

属性“ProductID”是对象关键信息的一部分,无法修改。

代码是:

        int orderId = (int)detailsList.DataKeys[e.ItemIndex]["OrderID"];
int productId = (int)detailsList.DataKeys[e.ItemIndex]["ProductID"];

Order_Detail detail = repository.GetOrderDetail(orderId, productId);
detail.ProductID = int.Parse(e.NewValues["ProductID"] as string, CultureInfo.CurrentCulture);
detail.UnitPrice = decimal.Parse(e.NewValues["UnitPrice"] as string, CultureInfo.CurrentCulture);
detail.Quantity = short.Parse(e.NewValues["Quantity"] as string, CultureInfo.CurrentCulture);
detail.Discount = float.Parse(e.NewValues["Discount"] as string, CultureInfo.CurrentCulture);

repository.UpdateOrderDetail(detail);
repository.Save();

我谷歌了一下,找到了[this solution] ,表示一种方法是创建新 Product 的新实例并关联到 Order_Detail 的 Product 导航属性。

但是这样做我得到了另一个异常(exception):

发生引用完整性约束违规:当依赖对象为未更改时,不能更改作为引用完整性约束一部分的主键属性,除非它被设置为关联的主体对象。主体对象必须被跟踪并且不被标记为删除。

修改后的代码:

        int orderId = (int)detailsList.DataKeys[e.ItemIndex]["OrderID"];
int productId = (int)detailsList.DataKeys[e.ItemIndex]["ProductID"];
int newProductId = int.Parse(e.NewValues["ProductID"] as string, CultureInfo.CurrentCulture);

Order_Detail detail = repository.GetOrderDetail(orderId, productId);

detail.UnitPrice = decimal.Parse(e.NewValues["UnitPrice"] as string, CultureInfo.CurrentCulture);
detail.Quantity = short.Parse(e.NewValues["Quantity"] as string, CultureInfo.CurrentCulture);
detail.Discount = float.Parse(e.NewValues["Discount"] as string, CultureInfo.CurrentCulture);

Product newProduct = null;
// the product has been changed (it is part of the PK and cannot be directly changed)
if (productId != newProductId)
{
// get an instance of the new product
newProduct = repository.GetProduct(newProductId);
// update the detail item with the new product instance
detail.Product = newProduct;
}

repository.UpdateOrderDetail(detail);
repository.Save();

我该怎么做才能允许用户更改详细信息项中的产品?我真的不喜欢删除整个记录并用新产品重新创建它的想法。闻起来很臭!

谢谢!

最佳答案

表格设计得不好。实际上,您将不得不删除并重新添加整行。

正确的设计应该有一个单独的列作为 Order Details 表的主键(自动递增)。

除了您发现的限制外,该表不支持客户买一送一的情况。这将需要两个具有相同产品和订单 ID 的记录。

关于c# - 使用 EF 更新 PK 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6313243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com