1

我有一个使用表单身份验证的 MVC4 互联网应用程序。

开箱即用的UserProfile模型是在 Account 模型文件中创建的,我已将其移至其自己的文件并DbSet<UserProfile在我的文件中调用 > DbContext。我希望 EF 创建一个 2 表数据库,UserProfiles 和 Stories。

public class MySocialStoriesDb : DbContext
{
    public DbSet<UserProfile> UserProfiles { get; set; }
    public DbSet<Story> Stories { get; set; }
}

故事模型

[Table("Stories")]
public class Story
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int StoryId { get; set; }

    public int UserId { get; set; }

    [ForeignKey("UserId")]
    public virtual UserProfile User { get; set; }

    public string File { get; set; }
    public DateTime DateCreated { get; set; }
    public string Name { get; set; }
}

用户档案模型

[Table("UserProfile")]
public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }

    public string UserName { get; set; }
    public string EmailAddress { get; set; }
    public string UserDirectory { get; set; }
    public bool Paid { get; set; }
    public DateTime DatePaid { get; set; }
    public string PaymentId { get; set; }
}

我已经从包管理器运行 Enable-Migrations 并允许自动迁移和允许数据丢失。生成的 InitialCreate 文件似乎只创建了 User Profile 表,它的代码中没有任何 Story 表的内容。

我将以下行添加到 Global.asax

Database.SetInitializer(new Models.IntializeMySocialStoriesDb());

如果我现在更改模型,则数据库不会更改。如果我手动删除数据库并将其更改InitializeMySocialStoriesDb为 DropCreateDatabaseAlways 然后运行应用程序,则不会创建数据库。

我只是想知道我错过了什么。

4

1 回答 1

2

不要打扰这个机制。这对于生产应用程序是不可行的,并且每次架构更改时都需要您处理所有数据。

而是将您的数据库模式创建为一个单独的 SSDT 项目,并使用 DACPAC 文件来初始部署和升级您的生产数据库,同时保持所有数据完好无损。只需将 SimpleMembership 创建的表复制到您的 SSDT 项目中。

这样您就拥有了准确的列定义,可以准确地定义约束,准确地定义外键、主键和唯一键等,并且仍然可以通过应用程序项目中的实体框架访问您的数据。升级生产数据库上的模式只需要部署一个 DACPAC。

在开发过程中,当您在 SSDT 中进行更改时,Visual Studio 将自动对表结构进行任何更改。

简而言之,我认为代码优先定义过于松散、无组织且是个坏主意。

于 2013-04-23T11:03:53.293 回答