【記錄】EF Code First 實體關聯,如何添加、修改實體?


在使用 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),是修改不成功的,這邊紀錄一下這個問題,有時間研究下。

詳細資料:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM