使用相关实体更新实体框架

Ech*_*lon 3 asp.net entity-framework foreign-keys

我正在使用EF尝试使用ASP.NET更新实体.我正在创建一个实体,设置它的属性然后将其传递回具有ID的单独图层上的EF,以便可以应用更改.我这样做是因为我只存储实体的ID,当它绑定到UI控件时.

一切都适用于标准属性,但我无法更新产品(相关实体)的Category.ID.我已经尝试过EntityKey,EntityReference和其他一些但不保存类别ID.这就是我所拥有的:

Product product = new Product();
product.CategoryReference.EntityKey = new EntityKey("ShopEntities.Categories", "CategoryID", categoryId);
product.Name = txtName.Text.Trim();
... other properties
StockControlDAL.EditProduct(productId, product);

public static void EditProduct(int productId, Product product) {
 using(var context = new ShopEntities()) {
     var key = new EntityKey("ShopEntities.Products", "ProductID", productId);
     context.Attach(new Product() { ProductID = productId, EntityKey = key });
     context.AcceptAllChanges();
     product.EntityKey = key;
     product.ProductID = productId;
     context.ApplyPropertyChanges("ShopEntities.Products", product);
     context.SaveChanges();
 }
}
Run Code Online (Sandbox Code Playgroud)

我真的想使用EF,但我似乎在使用ASP.NET时遇到了一些问题.

Ale*_*mes 6

失败的原因有两个.

  1. 为了更新Reference(即Product.Category),您还必须在上下文中具有原始引用值.
  2. ApplyPropertyChanges(...)仅适用于实体的常规/标量属性,引用保持不变

所以我会做这样的事情(注意这段代码大量使用称为存根实体的技巧,以避免与EntityKeys混在一起)

Product product = new Product();
// Use a stub because it is much easier.
product.Category = new Category {CategoryID = selectedCategoryID};
product.Name = txtName.Text.Trim();
... other properties

StockControlDAL.EditProduct(productId, originalCategoryID);


public static void EditProduct(Product product, int originalCategoryID ) {
 using(var context = new ShopEntities()) 
 {
     // Attach a stub entity (and stub related entity)
     var databaseProduct = new Product { 
             ProductID = product.ProductID, 
             Category = new Category {CategoryID = originalCategoryID}
         };
     context.AttachTo("Products", databaseProduct);

     // Okay everything is now in the original state
     // NOTE: No need to call AcceptAllChanges() etc, because 
     // Attach puts things into ObjectContext in the unchanged state

     // Copy the scalar properties across from updated product 
     // into databaseProduct in the ObjectContext
     context.ApplyPropertyChanges("ShopEntities.Products", product);

     // Need to attach the updated Category and modify the 
     // databaseProduct.Category but only if the Category has changed. 
     // Again using a stub.
     if (databaseProduct.Category.CategoryID != product.Category.CategoryID)
     {
         var newlySelectedCategory = 
                 new Category {
                     CategoryID = product.Category.CategoryID
                 };

         context.AttachTo("Categories", newlySelectedCategory)

         databaseProduct.Category = newlySelectedCategory;

     }

     context.SaveChanges();
 }
}
Run Code Online (Sandbox Code Playgroud)

如果没有错别字等,这将完成这项工作.