字典类型属性

时间:2015-05-25 23:33:14

标签: c# entity-framework

我有一个名为Testimonials的模型,其中包含数据类型intstringDateTime的各种属性。我修改了我的模型以包含另一个Dictionary<string,Boolean>类型的属性。我一直在尝试迁移数据库以适应这种情况,但系统似乎没有检测到这个新属性。 Testimonials是上下文中唯一的模型(并且仅包含测试数据),因此我删除了数据库和.mdf以便彻底重建数据库。我还从项目中删除了旧的“迁移”文件夹。自从修改Testimonials模型以来,我还多次重新编译整个项目。

我在软件包管理器控制台中执行以下操作:

enable-migration -ContextTypeName myProjectName.Models.myProjectNameContext

add-migration InitialCreate

在此步骤之后创建xxxxxxxxxxx_InitialCreate.cs迁移文件并查看它我发现没有添加到我的模型的Dictionary<string,Boolean>属性的数据库代码,只有我之前拥有的属性的生成。在Package Manager控制台中输入命令:update-database会按预期生成不正确的数据库,看起来与先前数据库的结构相同。

我还尝试重新创建无效的TestimonialsController.cs

是否存在与属性类型Dictionary<string, Boolean>不兼容的内容,或者我只是做了一些根本错误/愚蠢的事情?

我还要注意,我对MVC 5,实体框架和代码优先迁移都很陌生。

编辑:

我已应用以下更改,以便Dictionary是自己的模型。

我的Testimonials.cs

public class Testimonial
{
    public int Id { get; set; }
    [Required]
    [Display(Name = "Testimonial")]
    [StringLength(600, ErrorMessage = "The {0} must be less than 600 characters.", MinimumLength = 1)]
    public string Content { get; set; }
    public DateTime CreationTime { get; set; }
    public string Author { get; set; }
    public int Rating { get; set; }
    public virtual ICollection<Vote> VoteList { get; set; } 

}

我的Vote.cs(字典是什么):

public class Vote
{
    public int Id { get; set; }
    public Testimonial VotedOn { get; set; }
    public string User { get; set; }
    public bool UpDown { get; set; } //True is upvote, False is downvote.
    public DateTime DateTime { get; set; }
}

随后的xxxxxxxxx_InitialCreate.cs

public override void Up()
        {
            CreateTable(
                "dbo.Testimonials",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        Content = c.String(nullable: false, maxLength: 600),
                        CreationTime = c.DateTime(nullable: false),
                        Author = c.String(),
                        Rating = c.Int(nullable: false),
                    })
                .PrimaryKey(t => t.Id);

            CreateTable(
                "dbo.Votes",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        User = c.String(),
                        UpDown = c.Boolean(nullable: false),
                        DateTime = c.DateTime(nullable: false),
                        VotedOn_Id = c.Int(),
                    })
                .PrimaryKey(t => t.Id)
                .ForeignKey("dbo.Testimonials", t => t.VotedOn_Id)
                .Index(t => t.VotedOn_Id);

        }

        public override void Down()
        {
            DropForeignKey("dbo.Votes", "VotedOn_Id", "dbo.Testimonials");
            DropIndex("dbo.Votes", new[] { "VotedOn_Id" });
            DropTable("dbo.Votes");
            DropTable("dbo.Testimonials");
        }

正如您所看到的,Vote正确引用了Testimonial,但从未生成IEnumberable<Vote>。我无法弄清楚原因。

2 个答案:

答案 0 :(得分:1)

您可以创建一个可以容纳您想要使用的词典的类。

   Public class DictionaryModel { 
    public int DictionayID; 
    public string StringVar; 
    public bool BooleanVar;
  }

然后您将DictionaryModel作为推荐书模型上的列表引用:

public class Testimonials{
   ...
   public List<DictionayModel> Dictionary; 
}

作为示例,我设置了Name&#34; DictionaryModel&#34;,但您可以使用对您的代码更有意义的名称进行定义。

答案 1 :(得分:1)

在EF中你不能使用Dictionary将POCO属性映射到数据库表,但你可以使用正常的一对多映射,如下所示:

public class KeyValue {
    public int Id { get; set; } 
    public string Key { get; set; }
    public bool Value { get; set; }
    public Testimonial Testimonial { get; set; }
}

public class Testimonial{
    public int Id { get; set; } 
    public virtual ICollection<KeyValue> Dictionary { get; set; }
}
BTW,您的问题与MVC无关,但与EF和Code-First映射无关。