2016-06-06 22 views
0

Ich bin neu in EF und in meinem Code erstes Modell, das ist meine Lokalität Klasse:Füllung Navigationseigenschaft?

public class Locality : ILocality 
{ 
    public int ID { get; set; } 
    [Required] 
    [MaxLength(150)] 
    [Display(Name = "Locality")] 
    public string Description { get; set; } 
} 

Das ist meine Schulklasse, die ich über eine Navigationseigenschaft Ort haben, und es ist eine 1-1-Beziehung:

public class School : ISchool 
{ 
    public int ID { get; set; } 
    [Required] 
    [MaxLength(150)] 
    [Display(Name = "School")] 
    public string Description { get; set; } 
    [Required] 
    [Display(Name = "Locality")] 
    public int LocalityID { get; set; } 

    public virtual ILocality Locality { get; set; } 
} 

Gerade jetzt in meiner Schule Controller meine Lösung, die ich habe, ist, wie die folgende:

public ActionResult SchoolList() 
    { 
     var allschools = schools.GetAll(); 
     foreach (var school in allschools) 
     { 
      school.Locality = localities.GetById(school.LocalityID); 
     } 

     return View(allschools); 
    } 

Meine Frage ist, dass, wenn ich brauche, um die Navigation prop zuzugreifen erty Ort und ich muss immer oben sonst der Code füllen verwendet, wird sie null sein:

 foreach (var school in allschools) 
     { 
      school.Locality = localities.GetById(school.LocalityID); 
     } 

ich gelesen, dass Navigationseigenschaft automatisch gefüllt werden soll, wenn ein Fremdschlüssel Setup ist? Wenn ja, wie mache ich das?

Antwort

1

Es wird verursacht, dass Locality Eigenschaft ILocality statt Locality haben. Und EF nicht LocalityID und Locality Eigenschaften als Navigation, dh FK, so Locality Einheit wird nicht automatisch geladen, weil ILocality Schnittstelle ist, dh Abstraktion, die von vielen Klassen implementiert werden kann, und jede Klasse hat ihre eigenen Eigenschaften (Spalten), Name usw., also EF ist verwirrt und weiß nicht, was zu tun ist, als Folge ignoriert es diese Eigenschaft. Um es zu beheben, ersetzen Sie einfach Art von Schnittstelle zu Klasse:

public class School : ISchool 
{ 
    //other stuff... 

    //public virtual ILocality Locality { get; set; } 
    public virtual Locality Locality { get; set; } 
} 

P. S. Wenn ISchool Schnittstelle memeber hat: ILocality Locality { get; set; } Sie können dies tun:

public class School : ISchool 
{     
    //other stuff... 
    [ForeignKey("LocalityDB")] 
    public int LocalityID { get; set; } 

    [NotMapped] 
    public ILocality Locality { 
     get { 
      return LocalityDB; 
     } 
     set { 
      if (value is Locality) 
       LocalityDB = (Locality)value; 
     } 
    } 
    public virtual Locality LocalityDB { get; set; } 
} 

Überprüfen Sie auch, dass Lazy Loading eingeschaltet ist.

+0

Vielen Dank @Slava, ich kann jetzt sehen, wenn die Tabelle erstellt wird, verwenden Sie LocalityID automatisch als Fremdschlüssel jetzt. Wie aber kann ich jetzt im List-Controller darauf zugreifen? Ich erhalte einen Fehler in der Listenansicht "Zu diesem Befehl gehört bereits ein offener DataReader, der zuerst geschlossen werden muss." wenn es zu @ Html.DisplayFor geht (ModelItem => item.Locality.Description) –

+1

Es passiert, weil Sie Elemente, dann Kontext wurde geschlossen und dann versuchen Sie, Locality-Eigenschaft zu erhalten, aber der Kontext wurde bereits geschlossen. Um es zu beheben, sollten Sie 'Locality' -Eigenschaft explizit durch eifriges Laden laden:' var allschools = context.schools.Include (x => x.Locality) .ToList(); ' –

+0

Vielen Dank @Slava! –