2012-11-23 41 views
5

Tôi có lớp DBcontext đơn giản gọi là OdeToFoodDb:Entity Framework đối tượng null

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

và định nghĩa lớp:

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

vấn đề của tôi là khi tôi chọn một bài đánh giá từ dbcontext như thế này:

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

tôi đã kiểm tra rằng review.Restaurant là null! trong khi tài sản khác có giá trị. Có gì sai với mã của tôi?

+0

Bạn không bỏ lỡ đối tượng bao gồm đối tượng Nhà hàng trong truy vấn của mình? Tôi không chắc chắn những gì FindTheLatest đang làm nhưng điều này nên _db.Reviews.Include (r => r.Restaurant) .FindTheLatest (1) .Single() hoặc _db.Reviews.Include ("Nhà hàng"). FindTheLatest (1) .Single() – Khepri

+0

@Khepri Tôi mới vào khung thực thể. Bạn có thể tập hợp phương pháp 'Bao gồm' nào không? –

+0

Bao gồm tải thuộc tính điều hướng trong kết quả của bạn. Nếu bạn không bao gồm tuyên bố đó, kết quả cho thuộc tính điều hướng không được điền. – Khepri

Trả lời

8

Hoặc tải bất động sản chuyển hướng Restaurant một cách rõ ràng qua Include phương pháp:

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

hoặc bạn có thể kích hoạt tính năng tải lười biếng cho thuộc tính đó bằng cách làm cho nó ảo:

public virtual Restaurant Restaurant { get; set; } 

Bạn có thể đọc thêm về tải liên quan thực thể here.

+1

Tôi đã sử dụng phương pháp thứ hai và nó hoạt động tốt. –

+0

Bạn có thể cho tôi biết trong mã trên không, từ khóa 'ảo' là gì? –

+1

@SeyedMortezaMousavi: thuộc tính 'virtual' trong bất kỳ loại thực thể nào là dấu hiệu cho ngữ cảnh tạo proxy động, khi làm việc với các cá thể của loại thực thể đó. Đặc biệt, với các thuộc tính điều hướng, điều này có nghĩa, ngữ cảnh đó cung cấp tải chậm - khi bạn gọi thuộc tính getter, đối tượng proxy tải giá trị thuộc tính và trả về kết quả. Tôi đã thêm một liên kết vào một câu trả lời. – Dennis

Các vấn đề liên quan