2012-11-23 25 views
5

Ich habe einfach DbContext Klasse namens OdeToFoodDb:Entity Framework Null-Objekt

public class OdeToFoodDb: DbContext 
{ 
    public DbSet<Restaurant> Restaurants { get; set; } 
    public DbSet<Review> Reviews { get; set; } 

    protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Restaurant>() 
      .HasMany(resturant => resturant.Reviews) 
      .WithRequired(review => review.Resturant); 
     base.OnModelCreating(modelBuilder); 
    } 
} 

und die Klassendefinition:

public class Restaurant 
{ 
    //public virtual int ID { get; set; } 
    public virtual int RestaurantId { get; set; } 
    public virtual string Name { get; set; } 
    public virtual Address Address { get; set; } 
    public virtual IList<Review> Reviews { get; set; } 
} 

public class Review : IValidatableObject 
{ 
    public int ReviewId { get; set; } 

    [DisplayName("Digning Date")] 
    [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)] 
    [DataType(DataType.Date)] 
    public DateTime Created { get; set; } 

    [Range(1, 10)] 
    public int Rating { get; set; } 

    [Required] 
    [DataType(DataType.MultilineText)] 
    public string Body { get; set; } 
    public int RestaurantId { get; set; } 
    public Restaurant Resturant { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     var fields = new[]{ "Created"}; 

     if(Created > DateTime.Now) 
     { 
      yield return new ValidationResult("Created date cannot be in the future.", fields); 
     } 

     if (Created < DateTime.Now.AddYears(-1)) 
     { 
      yield return new ValidationResult("Created date cannot be to far in the past.", fields); 
     } 
    } 
} 

mein Problem ist, wenn ich eine Bewertung von DbContext wie folgt wählen:

OdeToFoodDb _db = new OdeToFoodDb(); 
    public PartialViewResult LatestReview() 
    { 
     var review = _db.Reviews.FindTheLatest(1).Single(); 
     //************************************ 
     return PartialView("_Review", review); 
    } 

Ich habe überprüft, dass die Bewertung. Restaurant ist null! während die andere Eigenschaft einen Wert hat. Was ist falsch an meinem Code?

+0

Fehlt Ihnen in Ihrer Anfrage kein Include des Restaurant-Objekts? Ich bin nicht sicher, was FindTheLatest tut, aber das sollte _db.Reviews.Include sein (r => r.Restaurant) .FindTheLatest (1) .Single() oder _db.Reviews.Include ("Restaurant"). FindTheLatest (1) .Single() – Khepri

+0

@Khepri Ich bin neu im Entity-Framework. Können Sie die "Include" -Methode anwenden? –

+0

Include lädt die Navigationseigenschaft in Ihr Ergebnis. Wenn Sie diese Anweisung nicht einschließen, werden die Ergebnisse für die Navigationseigenschaft nicht ausgefüllt. – Khepri

Antwort

8

Entweder Last Navigationseigenschaft Restaurant explizit über Include Methode:

var review = _db.Reviews.Include(r => r.Restaurant).FindTheLatest(1).Single(); 

oder Sie verzögertes Laden für diese Eigenschaft aktivieren können, es virtuell, indem sie:

public virtual Restaurant Restaurant { get; set; } 

Sie ähnliche mehr zum Laden lesen Einheiten here.

+1

Ich habe die zweite Methode verwendet und es funktioniert gut. –

+0

Können Sie mir im obigen Code sagen, was das Keyword "virtual" bedeutet? –

+1

@SeyedMortezaMousavi: 'virtuelle' Eigenschaft in einem beliebigen Entitätstyp ist eine Markierung für den Kontext, um dynamische Proxies zu erstellen, wenn mit Instanzen dieses Entitätstyps gearbeitet wird. Insbesondere bei Navigationseigenschaften bedeutet dies, dass Kontext lazy loading bereitstellt. Wenn Sie den Eigenschaften-Getter aufrufen, lädt das Proxyobjekt den Eigenschaftswert und gibt das Ergebnis zurück. Ich habe einen Link zu einer Antwort hinzugefügt. – Dennis