使用相关实体更新实体框架
我正在使用EF来尝试使用ASP.NET更新实体。 我正在创建一个实体,设置它的属性,然后将它传递回带有ID的单独图层上的EF,以便可以应用更改。 我这样做是因为我只在被绑定到UI控件时存储实体的ID。
一切适用于标准属性,但我无法更新产品(相关实体)的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();
 }
}
我真的很想使用EF,但我似乎在使用ASP.NET时遇到了一些问题。
这是接受这个问题的答案用实体框架强类型化ASP.NET MVC
context.AttachTo(product.GetType().Name, product);
ObjectStateManager stateMgr = context.ObjectStateManager;
ObjectStateEntry stateEntry = stateMgr.GetObjectStateEntry(model);
stateEntry.SetModified();
context.SaveChanges();
你试过了吗?
[更新,顶部的代码不起作用]
这是我使用的小扩展属性,所以下一个代码块更容易理解:
public partial class Product
{
    public int? CategoryID
    {
        set
        {  
           CategoryReference.EntityKey = new EntityKey("ShopEntities.Categories", "CategoryID", value);
        }
        get
        {
            if (CategoryReference.EntityKey == null)
                return null;
            if (CategoryReference.EntityKey.EntityKeyValues.Count() > 0)
                return (int)CategoryReference.EntityKey.EntityKeyValues[0].Value;
            else
                return null;
        }
    }
}
这对我来说很有效(这次肯定):
System.Data.EntityKey key = new System.Data.EntityKey("ShopEntities.Products", "ProductID", productId);
        object originalItem;   
        product.EntityKey = key;
        if (context.TryGetObjectByKey(key, out originalItem))
        {
            if (originalItem is EntityObject &&
                ((EntityObject)originalItem).EntityState != System.Data.EntityState.Added)
            {
                Product origProduct = originalItem as Product;   
                origProduct.CategoryID == product.CategoryID;//set foreign key again to change the relationship status           
                context.ApplyPropertyChanges(
                    key.EntitySetName, product);
            }
        }context.SaveChanges();
当然,这看起来很黑。 我认为,原因是因为EF关系具有作为实体的状态(修改,添加,删除),并且基于该状态,EF会更改外键的值或删除行,如果多对多关系在情况下。 出于某种原因(不知道为什么),关系状态不会与财产状态相同。 这就是为什么我必须在originalItem上设置CategoryReference.EntityKey才能更改关系的状态。
这失败的原因有两个。
所以我会做这样的事情(注意,这段代码大量使用了一个称为存根实体的技巧,以避免使用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();
 }
}
这将完成这项工作,假设没有错别字等。
链接地址: http://www.djcxy.com/p/5723.html