2012-11-23 19 views
5

Mam proste klasy DBcontext nazywa OdeToFoodDb:Entity Framework zerowy obiektu

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

i definicja klasy:

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

moim problemem jest to, kiedy wybrać ocenę z dbcontext tak:

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

Sprawdziłem, czy recenzja.Restauracja jest zerowa! podczas gdy inne nieruchomości mają wartość. Co jest nie tak z moim kodem?

+0

Nie brakuje w Państwa zapytaniu obiektu restauracji? Nie jestem pewien, co robi FindTheLatest, ale powinno to być _db.Reviews.Include (r => r.Restaurant) .FindTheLatest (1) .Single() lub _db.Reviews.Include ("Restaurant"). FindTheLatest (1) .Single() – Khepri

+0

@ Khepri Jestem nowy w strukturze encji. Czy możesz opracować metodę "Uwzględnij"? –

+0

Uwzględnij ładuje właściwość nawigacji w wyniku. Jeśli nie uwzględnisz tego stwierdzenia, wyniki dla właściwości nawigacji nie zostaną wypełnione. – Khepri

Odpowiedz

8

nieruchomość nawigacja obciążenie Albo Restaurant wyraźnie poprzez Include metody:

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

lub można włączyć leniwy załadunku dla tej nieruchomości, przez co wirtualna:

public virtual Restaurant Restaurant { get; set; } 

Możesz przeczytać więcej o ładowaniu pokrewne podmioty here.

+1

Użyłem drugiej metody i działa dobrze. –

+0

Czy możesz mi powiedzieć w powyższym kodzie, co słowo kluczowe "wirtualne"? –

+1

@SeyedMortezaMousavi: właściwość 'virtual' w dowolnym typie obiektu jest znakiem kontekstu służącym do tworzenia dynamicznych serwerów proxy podczas pracy z instancjami tego typu obiektu. W szczególności, w przypadku właściwości nawigacyjnych, oznacza to, że kontekst zapewnia leniwy ładunek - podczas wywoływania funkcji getter obiekt proxy ładuje wartość właściwości i zwraca wynik. Dodałem link do odpowiedzi. – Dennis