在Entity Framework v1中添加和更新外鍵

entity-framework foreign-keys

我正在使用.NET 3.5 SP1。我根據表'app_User_table'創建了基於表'category_table'和'MyUser'的實體'Category'。

CREATE TABLE category_table (
 catg_id int,
 catg_name varchar(50),
 catg_description varchar(250)
 )

CREATE TABLE App_User_table (
 userid int,
 username varchar(50),
 fullname varchar(50), catg_id int,
 fullAddress varchar(200),
 comments varchar(1000),CONSTRAINT FK_1 FOREIGN KEY (catg_id) REFERENCES Category_table (catg_id) 
)

public class Category: System.Data.Objects.DataClasses.EntityObject{    
 public int  CategoryId{get; set;}   
 public string CategoryName {get; set;} 
  ....
}

public class AppUser : System.Data.Objects.DataClasses.EntityObject{   
 public int Uid {get; set;}   
 public string UserName {get; set;}   
 public string Name {get; set;}   
 public string Address {get; set;}
 public string Comment {get; set;} 
 public Category category_table  { .. } 
 public System.Data.Objects.DataClasses.EntityReference<Category> category_tableReference {...}
 ...........   
}

我想在ASP.NET MVC應用程序中添加和更新AppUser實體。

對於添加:

//create entity with passed values
AppUser user = new AppUser(){Uid=id, ....  }
//Set EntityReference
user.category_tableReference.EntityKey = new System.Data.EntityKey("MyContext.CategorySet", "CategoryId", categoryIdSelected);
myContext.AddToCategorySet(user);
myContext.SaveChanges(true);

更新:

//create entity with passed Id 
AppUser user = new AppUser(){Uid=id  }
//Attach entitymyContext.AttachTo("UserSet", user);
//Update entity with passed values
user.Address = addr;
....

//從DropDownList更新選定的CategoryId

user.category_tableReference.EntityKey = new System.Data.EntityKey("MyContext.CategorySet", "CategoryId", categoryId);

Update方法不會更新數據庫中的CategoryId。

請告訴我,解決問題的最佳方法是什麼?

謝謝。

一般承認的答案

以下是我在MVC應用程序中用於Update的方法:

// Put the original Stub Entities for both the original User and its 
// original category. The second part is vital, because EF needs to know 
// original FK values to successfully do updates in 3.5 SP1
AppUser user = new AppUser {
    Uid = id, 
    Category = new Category {
        CategoryId = OriginalCategoryID
    }
};
ctx.AttachTo("UserSet", user);

// Then do this:
if (user.Category.CategoryId != categoryIdSelected)
{
    Category newCategory = new Category {CategoryId = CategoryIdSelected};
    // Attach because I assume the category already exists in the database
    ctx.AttachTo("CategorySet", newCategory);
    user.Category = newCategory;
}

// Update entity with passed values
user.Address = addr;
....

如您所見,您需要能夠從某個地方獲取OriginalCategoryID,我建議在表單上使用隱藏字段。

這將完成您需要的一切。查看提示26 - 如何使用存根實體避免數據庫查詢以獲取有關存根實體技巧的更多信息。

希望這可以幫助

亞歷克斯


熱門答案

更新:請參閱Craig Stuntz和Alex James的評論 - 我已經糾正了 - 似乎可以簡單地更新“EntityKey”以實現您的要求。我在這裡的帖子不再適用了

在版本1中,實體框架無法僅使用插入的外鍵值 - 您需要將“類別”對象實例添加到“AppUser”的Cateogry導航屬性中:

//create entity with passed values
AppUser user = new AppUser(){Uid=id, ....  }

// set the Category navigation property
Category newUserCategory  = Category.GetbyID(4); // or whatever you need
user.Category = newUserCategory;

myContext.AddToCategorySet(user);
myContext.SaveChanges(true);

使用將在今年晚些時候(2009年)發布的.NET 4.0的EF v4,您將能夠設置外鍵值以使兩個實體之間的關聯發生。

在這裡查看更多信息:

但是現在,你需要設置完整的對象 - 只是引用不會。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因