2016-12-04 2 views
1

Ich habe zwei EF-Modelle/Klassen, die eine Beziehung zwischen ihnen haben: Mitglied und MembershipSeason. Ein Mitglied kann mehrere haben MitgliedschaftSeasons. One MembershipSeason Modell hat eine Fremdschlüssel Referenz (MemberID) bis Mitglied Modell in db.Verfolgt EF verwandte Modelle und legt ihre Fremdschlüssel bei Bedarf fest?

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; } 
} 

Ich experimentierte diese beiden Modelle auf den gleichen erstellen Methode zusammen in der gleichen Zeit zu schreiben. Ich entdeckte, dass EF diese beiden Modelle verfolgt und sie als neue Modelle in db speichert. Es verbindet auch diese beiden Modelle durch die Einstellung MemberID des neuen Mitglieds Modells als Fremdschlüssel für das neue Modell MembershipSeason in db. Ich denke, das ist geplantes Verhalten? - Ich meine die Tatsache, dass EF den Fremdschlüssel zu den verwandten Modellen automatisch als erwartetes Verhalten setzt - wie die Dinge funktionieren sollten. Deshalb denke ich, dass ich Mitglied Modell nicht erst speichern müssen, erhalten sie ist MemberID und es für MembershipSeason und separat in der erstellen Methode speichern? (Da EF macht die Arbeit für Sie)

db.Members.Add(member); 

db.MembershipSeasons.Add(membershipSeason); 

await db.SaveChangesAsync(); 

Die oben und die unten erstellen Methode funktioniert in der Weise, dass kein MemberID Eigenschaft benötigt wird, eingestellt werden direkt an MembershipSeason Modell, weil EF tut es automatisch.

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); 
     } 
    } 

Ich bin ganz neu mit EF und ASP.NET MVC, so versuche ich, diese Dinge herauszufinden. Jede Hilfe geschätzt - danke.

Antwort

2

Es verbindet diese beiden Modelle auch, indem die MemberID des neuen Mitgliedsmodells als Fremdschlüssel für das neue MembershipSeason-Modell in db festgelegt wird. Ich denke, das ist geplantes Verhalten?

TL; DR: Ja

Ja, es hat das erforderliche Verhalten sein.Fängt sich mit liest:

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); 
} 

Grundsätzlich, wenn Sie EF fragen die Navigationseigenschaft schließen Sie ein Objekt Graph bekommen ein bisschen wie:

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

Es gesunden Menschenverstand würde davon ausgehen, dass, weil EF should keep track of entities weil was passiert, wenn Sie dies tun:

var employee = GetEmployeeWithOrganization(<guid1>) 

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

employee.Organization = org; 

_context.SaveChanges(); 

welche dieser ein gültiges Objekt ist:

A:

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

B:

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

A ist nicht gültig, da Sie nicht, dass die Werte und die Programmierung gegen das Objekt verlassen kann nicht nur ein völlig Alptraum sein, aber Die Datenbankebene ist nicht sinnvoll. B ist gültig, es sind Daten, auf die Sie sich verlassen können.

Dies bedeutet auch, dass Sie Artikel vormerken können und EF wird sie automatisch aufschreiben. Überlegen Sie:

Dies passiert, weil EF org verfolgt und weil EF mit org als FK zu Mitarbeiter konfiguriert ist.

+0

Vielen Dank für Ihre großartige Antwort und für den nützlichen MSDN Link auf Entity Framework Self-Tracking Entities. Jetzt kann ich EF weiter verwenden, ohne dass dabei ein unerwartetes Verhalten auftauchen könnte :-) – jyrkim

Verwandte Themen