【问题标题】:EF6 MVC5 Code First Migrations not working for 1 Table/ClassEF6 MVC5 代码优先迁移不适用于 1 个表/类
【发布时间】:2014-01-20 16:17:40
【问题描述】:

我正在 Visual Studio 2013 中使用 Code First 迁移和 EF6 构建一个 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 生成的,SurveyItem 的父类 Survey 类也是如此。下面是其他成功生成的代码。

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

请帮忙!任何有关如何解决此问题的想法将不胜感激!

【问题讨论】:

  • 您的数据上下文类是什么样的?那里有DbSet&lt;SurveyItemOption&gt;吗?
  • 感谢您的回复!不,还没有它的 DbSet。在运行迁移以创建新表后,我一直在添加这些。不过,我确实解决了这个问题。请参阅下面的答案。

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


【解决方案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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    • 2023-01-30
    • 2016-04-16
    • 2020-07-28
    • 1970-01-01
    相关资源
    最近更新 更多