我正在Visual Studio 2013中使用EF6进行Code First迁移来构建MVC5项目。到目前为止,一切都按预期工作:多次迁移向我的数据库添加多个表。在添加应该映射到新数据库表的新类之后,add-migration将不会获取新类,并且在Up()和Down()方法中生成没有代码的新迁移文件。有问题的课程尽可能简单:
[Table("SurveyItemOption")]
public class SurveyItemOption
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Option { get; set; }
public virtual SurveyItem SurveyItem { get; set; }
}
正如您所看到的,我自己添加了DatabaseGenerated属性,看看是否有所不同,但它仍然没有获取新类并创建新表。 SurveyITem是父类,其db表是使用Code First生成的,Survey类是SurveyItem的父类。以下是成功生成的其他代码。
public enum ListType
{
None = 0,
Circle = 1,
Square = 2,
LowerAlpha = 3,
LowerLatin = 4,
LowerRoman = 5,
UpperAlpha = 6,
UpperLatin = 7,
UpperRoman = 8
}
[Table("Survey")]
public class Survey
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Title { get; set; }
public bool IsActive { get; set; }
public string Owner_UserId { get; set; }
public int Module_Id { get; set; }
public virtual IEnumerable<SurveyItem> Items { get; set; }
}
[Table("SurveyItem")]
public class SurveyItem
{
public SurveyItem() {
this.OptionListType = ListType.None;
}
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Item { get; set; }
public int Survey_Id { get; set; }
[EnumDataType(typeof(ListType))]
public ListType OptionListType { get; set; }
public virtual int OptionListTypeId
{
get
{
return (int)this.OptionListType;
}
set
{
this.OptionListType = (ListType)value;
}
}
}
[Table("SurveyAnswer")]
public class SurveyAnswer
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string UserId { get; set; }
public string Answer { get; set; }
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Computed)]
public DateTime Created { get; set; }
public virtual SurveyItem SurveyItem { get; set; }
}
我已经创建了一个新项目并从该项目中导入了所有模型,视图和控制器(以及各种内容文件),构建了项目并启用了迁移。 SurveyItemOption类在初始迁移代码中仍被忽略。
请帮忙!关于如何解决这个问题的任何想法都将非常感激!
答案 0 :(得分:1)
我确信有一个很好的技术解释为什么这个表不是由Code First生成的,但是我意识到SurveyItem,SurveyItemOption和SurveyAnswer(它存储用户的答案)之间的关系缺乏。最初,我不会包含项目选项,因此我只在SurveyItem和SurveyAnswer之间建立了关系。 SurveyAnswer有一个SurveyItem的外键,所以我的猜测是EF不喜欢我在不同的表上创建相同的关系。我还意识到SurveyAnswer需要一个SurveyItemOption的外键才能存储SurveyItemOption作为答案。添加这种关系解决了我的问题。
[Table("SurveyAnswer")]
public class SurveyAnswer
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string UserId { get; set; }
public string Answer { get; set; }
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Computed)]
public DateTime Created { get; set; }
public virtual SurveyItem SurveyItem { get; set; }
public virtual SurveyItemOption SurveyItemOption { get; set; }
}
更新: 似乎另一个要求是确保在数据上下文中设置DbSet。