EF6 MVC5代码优先迁移不适用于1个表/类

时间:2014-01-20 16:17:40

标签: c# sql-server-2008 ef-code-first visual-studio-2013

我正在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类在初始迁移代码中仍被忽略。

请帮忙!关于如何解决这个问题的任何想法都将非常感激!

1 个答案:

答案 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。