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.
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