【问题标题】:EntityType 'MvcHtmlString' has no key defined - MVC 4EntityType 'MvcHtmlString' 没有定义键 - MVC 4
【发布时间】:2013-11-25 09:33:55
【问题描述】:

我有一个包含 MvcHtmlString 类型变量的页面类。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
using System.Globalization;
using SpringHealthOne.SpringWS;
using System.Configuration;

namespace SpringHealthOne.Models
{
    public class Page 
    {
        public int PageID { get; set; }
        [Required]
        public string Title { get; set; }
        [Required]
        public MvcHtmlString PageBody { get; set; }
        public string MetaTitle { get; set; }
        public string MetaDescription { get; set; }
        public string Keywords { get; set; }
        public bool Published { get; set; }
    }
}

这本身很好,Visual Studios 2012 不会报告任何错误或警告。但是,当我尝试在调试模式下启动项目时,它会抛出:

在模型生成过程中检测到一个或多个验证错误:

\tSystem.Data.Entity.Edm.EdmEntityType: : EntityType 'MvcHtmlString' 没有定义键。定义此 EntityType 的键。 \tSystem.Data.Entity.Edm.EdmEntitySet:EntityType:EntitySet “MvcHtmlStrings”基于没有键的“MvcHtmlString”类型 已定义。

它在我的 MenuController 中的行:

IEnumerable<MenuItem> menuItems = db.MenuItems.Where(c => c.ParentID == null).OrderBy(c => c.DisplayOrder).Select(c => c);

我已经跟踪到调用 Page 类的数据库上下文,但我无法弄清楚为什么我会特别看到错误。

上下文:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration;
using System.ComponentModel.DataAnnotations.Schema;
using SpringHealthOne.App_Start;
using System.Web.Mvc;

namespace SpringHealthOne.Models
{
    public class SpringerContext : DbContext
    {
        public DbSet<MenuItem> MenuItems { get; set; }
        public DbSet<Page> Pages { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            Database.SetInitializer<SpringerContext>(new SpringerContextInitializer());

            modelBuilder.Configurations.Add(new MenuItemConfiguration());
            base.OnModelCreating(modelBuilder);


        }
    }
}

我对 C# 很陌生,对 MVC 更是如此。任何帮助都会很棒。

【问题讨论】:

    标签: c# entity-framework asp.net-mvc-4


    【解决方案1】:

    MvcHtmlString 不是原始类型,所以不能直接保存到数据库的字段中。并且实体类型需要 ID 属性(否则您将无法在数据库中设置外键)。如果要将Page 对象存储在数据库中,请使用简单的string 而不是MvcHtmlString

    您也可以将此属性标记为未映射并创建将保存到数据库的字符串属性:

    [NotMapped]
    public MvcHtmlString PageBody { get; set; }
    
    public string Body
    {
        get { return PageBody.ToHtmlString(); }
        set { PageBody = new MvcHtmlString(value); }
    }
    

    【讨论】:

    • 啊,这可以解释很多!在这种情况下,我如何将 HTML 保存到数据库中?这就是为什么我首先尝试使用 MvcHtmlString :)
    • @N1ghteyes 我已经用示例更新了答案,该示例显示了如何在代码中拥有 MvcHtmlString 类型的属性,以及用于将数据保存到数据库的字符串类型属性
    • 谢谢,我现在有一个验证问题,但如果需要,我会在一个新问题中发布:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 2016-03-16
    • 2013-08-04
    • 2012-12-10
    相关资源
    最近更新 更多