文章出處
文章列表
在使用 EF Code First 的時候,我們經常會對項目中的 Entry 進行一對多、多對多的映射配置,這時候就會產生主實體和子實體的概念,我們在添加、修改他們的時候,有時候會產生一些問題,比如添加主實體的時候,我們不想添加子實體,看一個 User-Role 場景:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Age { get; set; }
public string Address { get; set; }
public DateTime DateAdded { get; set; }
public virtual Role Role { get; set; }
}
public class Role
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime DateAdded { get; set; }
}
User 和 Role 是一對多的關系,比如我們添加一個 User 對象,然后給這個對象的 Role 屬性賦一個已存在的 Role 對象值,示例代碼:
using (var context = new UserRoleDbContext())
{
User user = new User { Name = "test", Age = "12", Address = "test" };
user.Role = context.Role.Find(1);
context.Users.Add(user);
context.SaveChanges();
}
這段代碼實際運行結果是,數據庫添加了一個 User,但也同時添加了一個 Role,這是我們不想要的,正確的應該這樣配置:
using (var context = new UserRoleDbContext())
{
User user = new User { Name = "test", Age = "12", Address = "test" };
user.Role = context.Role.Find(1);
context.Entry(user.Role).State = EntityState.Unchanged;
context.Users.Add(user);
context.SaveChanges();
}
如何修改數據呢?示例代碼:
using (var context = new UserRoleDbContext())
{
User user = context.Users.Find(1);
user.Role = context.Role.Find(1);
context.Entry(user).State = EntityState.Modified;
context.SaveChanges();
}
上面修改示例代碼很簡單,所以也不會出現什么問題,但是我們平常在使用 EF 的時候,并不會這樣寫,比如我們要修改一個 Entry,這個對象不會是從 Context 中獲取的,而是使用 MVC,在View 中獲取的,這時候我們再賦屬性對象值進行修改,我試了一下,Entry 的普通屬性類型(比如 int、string 等),是可以修改的,但是如果是關聯屬性對象(比如上面的 Role),是修改不成功的,這邊紀錄一下這個問題,有時間研究下。
詳細資料:
文章列表
全站熱搜