2016-12-04 54 views
1

我有兩個EF模型/類有它們之間的關係:成員MembershipSeason。一個會員可以有幾個MembershipSeasons。一個MembershipSeason模型有一個外鍵參考(MemberID)到成員模型在分貝。EF是否跟蹤相關模型,並在需要時設置其外鍵?

Member.cs

public class Member 
{ 
     public int MemberID { get; set; } 

     //some properties left out 
     public virtual ICollection<MembershipSeason> MembershipSeasons { get; set; } 
} 

MembershipSeason.cs

public class MembershipSeason 
{ 
     [Key] 
     public int MembershipSeasonID { get; set; } 

     //some properties left out 
     public int MemberID { get; set; } 
     public virtual Member Member { get; set; } 
} 

我嘗試以這兩個模型張貼到同一在同一時間一起創建方法。我發現EF跟蹤這兩個模型並將它們保存爲db作爲新模型。它還通過設置會員ID的新會員模型作爲外鍵到新的MembershipSeason模型分貝鏈接這兩個模型。我猜這是計劃的行爲? - 我的意思是,EF設置相關模型的外鍵自動似乎是預期的行爲 - 事情應該如何工作。所以我想我不需要先保存會員模型,得到它的MEMBERID,並用它來MembershipSeason並將其單獨保存在創建方法? (因爲EF爲你做的工作)

db.Members.Add(member); 

db.MembershipSeasons.Add(membershipSeason); 

await db.SaveChangesAsync(); 

以上,並在不需要MEMBERID屬性直接設置爲MembershipSeason模型的方式,下面創建方法可行,因爲EF呢它會自動。

MemberController.cs

public class MemberController : Controller 
{ 
     private MembersContext db = new MembersContext(); 

     //some code left out 

     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public async Task<ActionResult> Create([Bind(Include = "MemberNumber,FirstName,LastName")] Member member, 
      [Bind(Include = "HasPaidMembership,SeasonId")] MembershipSeason membershipSeason) 
     { 
      try 
      { 
       if (ModelState.IsValid) 
       { 
        db.Members.Add(member); 

        db.MembershipSeasons.Add(membershipSeason); 

        await db.SaveChangesAsync(); 

        return RedirectToAction("Index"); 
       } 
      } 
      catch (DataException /* dex */) 
      { 
      } 
      return View(member); 
     } 
    } 

我與EF和ASP.NET MVC挺新的,所以我要把這些東西搞清楚。任何幫助表示讚賞 - 謝謝。

回答

2

它還通過將新成員模型的MemberID設置爲db中新的MembershipSeason模型的外鍵,鏈接這兩個模型。我猜這是計劃的行爲?

TL; DR:

是的,它必須是所需的行爲。讓我們從開始讀:

public class Organization 
{ 
    public Guid Id { get; set; } 
} 

public class Employee 
{ 
    public Guid Id { get; set; } 
    public Guid OrganizationId { get; set; } 
    public Organization Organization { get; set; } 
} 

public Employee GetEmployeeWithOrganization(guid id) 
{ 
    var result = _context.Employees 
    .Include(e => e.Organization) 
    .FirstOrDefault(e => e.Id = id); 
} 

基本上當你問到EF包括導航屬性,你會得到一個對象圖有點像:

Employee 
- Id : <guid1> 
- OrganizationId : <guid2> 
- Organization : object 
    - Id : <guid2> 

這將是常識的假設,因爲EF should keep track of entities因爲如果你這樣做,會發生什麼:

var employee = GetEmployeeWithOrganization(<guid1>) 

var org = new Organization { id = guid.NewGuid() }; //<guid3> 

employee.Organization = org; 

_context.SaveChanges(); 

其中哪一個是有效的對象:

答:

Employee 
- Id : <guid1> 
- OrganizationId : <guid2> // <-- difference 
- Organization : object 
    - Id : <guid3> 

B:

Employee 
- Id : <guid1> 
- OrganizationId : <guid3> // <-- difference 
- Organization : object 
    - Id : <guid3> 

A是無效的,因爲你不能依靠價值觀和針對對象編程不僅是一個完全的夢魘,但在數據庫級別沒有意義。 B是有效的,它是你可以依賴的數據。

這也意味着您可以預存項目,EF將自動寫入它們。考慮:

var org = GetOrganization(<guid3>); 

var emp = GetEmployee(<guid1>); 

Assert.That(emp.Organization, Is.Not.Null); // passes 

發生這種情況是因爲EF正在跟蹤org,並且因爲EF配置了org作爲員工的FK。

+0

感謝您爲我們提供的最佳答案以及有關實體框架自我跟蹤實體的有用MSDN鏈接。現在我可以繼續使用EF了,而不用擔心在這個過程中可能會出現任何意外的行爲:-) – jyrkim

相關問題