【问题标题】:CodeFirst, model property always null on fetchCodeFirst,模型属性在获取时始终为空
【发布时间】:2014-05-04 17:37:51
【问题描述】:

我正在使用 CodeFirst,但遇到了一个问题,我试图映射 0..1 -- n。 在模型 Media 中,我有一个 MediaCategory 类型的模型,这个模型有一个名为 MediaCategory_Id 的列,并在数据库中设置了一个 Id。但是,当我从数据库中获取数据时 MediaCategory 属性始终为空。我的问题是如何映射它,以便它通过它在数据库中获得的 Id 获取正确的数据?

我在 DbContext.cs 中尝试了一个 lil,但没有任何东西可以正常工作。 请注意,在我的存储库中,我已将 LazyLoading 设置为 true,将 Proxy 设置为 false。

上下文

public class BlogContext : DbContext
{
    public BlogContext()
        : base("name=DefaultConnection")
    {
        this.Configuration.ProxyCreationEnabled = false;
        this.Database.CreateIfNotExists();
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer(new DropCreateDatabaseIfModelChanges<BlogContext>());
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        modelBuilder.Entity<Post>().ToTable("Post");
        modelBuilder.Entity<PostMedia>().ToTable("PostMedia");
        modelBuilder.Entity<Media>().ToTable("Media");
        modelBuilder.Entity<MediaCategory>().ToTable("MediaCategory");

        modelBuilder.Entity<Media>().HasRequired(t => t.MediaCategory);
        modelBuilder.Entity<Post>().HasMany(t => t.MediaList);

    }

}

模型

媒体

public class Media
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    //[Required(ErrorMessage = "Title must be given.")]
    [MaxLength(250, ErrorMessage = "Title can't exceeded 250 characters in length.")]
    public string Title { get; set; }

    [Required(ErrorMessage = "File must be given.")]
    [MaxLength(Int32.MaxValue, ErrorMessage = "File exceeded max characters in length.")]
    public string File { get; set; }

    [MaxLength(250, ErrorMessage = "Description can't exceeded 250 characters in length.")]
    public string Description { get; set; }

    //[Required(ErrorMessage = "Author must be given.")]
    [MaxLength(50, ErrorMessage = "Author can't exceeded 50 characters in length.")]
    public string Author { get; set; }

    [Required(ErrorMessage = "Created date must be given.")]
    public DateTime? Created { get; set; }

    public DateTime? Changed { get; set; }

    public MediaCategory MediaCategory { get; set; }

}

媒体类别

public class MediaCategory
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required(ErrorMessage = "A title must be given.")]
    [MaxLength(50, ErrorMessage = "Title can't exceeded 50 characters in length.")]
    public string Title { get; set; }

    [MaxLength(250, ErrorMessage = "Description can't exceeded 250 characters in length.")]
    public string Description { get; set; }
}

已解决

public virtual MediaCategory MediaCategory { get; set; } and
this.Configuration.LazyLoadingEnabled = true;
this.Configuration.ProxyCreationEnabled = true; <-- This one was on false :)

【问题讨论】:

    标签: c# .net asp.net-mvc ef-code-first code-first


    【解决方案1】:
    //public MediaCategory MediaCategory { get; set; }
      public virtual MediaCategory MediaCategory { get; set; }
    

    【讨论】:

    • 添加virtual。这启用了实体框架的延迟加载功能。延迟加载意味着当您尝试访问这些属性时,它们的内容将自动从数据库中加载。
    • 看来这也是需要的。我把它设置为假... this.Configuration.ProxyCreationEnabled = true;
    • 是的,可能。对于代码优先,默认为 true。还要注意不要简单地new 一个对象,应该生成 Create() 方法。
    【解决方案2】:

    当您从数据库中获取数据时,除非已配置,否则您必须明确定义要包含的子对象。

    例如,您可能正在执行以下操作:

    _context.Media.Where( <some expression> );
    

    尝试将其更改为:

    _context.Media.Where( <some expression> ).Include(m > m.MediaCategory);
    

    【讨论】:

      猜你喜欢
      • 2018-07-29
      • 2020-09-18
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      相关资源
      最近更新 更多