Sey*_*avi 5 c# asp.net-mvc entity-framework
我有一个名为OdeToFoodDb的简单DBcontext类:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
和类定义:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是当我从dbcontext中选择一个评论时,如下所示:
OdeToFoodDb _db = new OdeToFoodDb();
public PartialViewResult LatestReview()
{
var review = _db.Reviews.FindTheLatest(1).Single();
//************************************
return PartialView("_Review", review);
}
Run Code Online (Sandbox Code Playgroud)
我检查了review.Restaurant是null!而其他财产有价值.我的代码出了什么问题?
Restaurant通过Include方法显式加载导航属性:
var review = _db.Reviews.Include(r => r.Restaurant).FindTheLatest(1).Single();
Run Code Online (Sandbox Code Playgroud)
或者您可以通过将其设置为虚拟来为该属性启用延迟加载:
public virtual Restaurant Restaurant { get; set; }
Run Code Online (Sandbox Code Playgroud)
您可以在此处详细了解如何加载相关实体.
| 归档时间: |
|
| 查看次数: |
5438 次 |
| 最近记录: |