我有一个名为Testimonials
的模型,其中包含数据类型int
,string
和DateTime
的各种属性。我修改了我的模型以包含另一个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>
。我无法弄清楚原因。
答案 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映射无关。