迁移不按我的意愿工作... Asp.net EntityFramework

时间:2013-04-03 17:48:22

标签: c# asp.net-mvc entity-framework

我正在学习本教程的asp.net电影教程,我的模型中有2个简单的文件。

 public class Movie
{
    public int ID { get; set; }

    [Required]
    public string Title { get; set; }


}

public class MovieDBContext : DbContext
{
    public DbSet<Movie> Movies { get; set; }


}

另一个是Visual Studio给我的帐户模型:

 public class UsersContext : DbContext
{
    public UsersContext()
        : base("DefaultConnection")
    {
    }

    public DbSet<UserProfile> UserProfiles { get; set; }
}

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


}

问题是......如果我添加了一个原因

 public int aaa { get; set; }

到UserProfile类,我没有对迁移进行任何更改....这是因为迁移只更新了MovieDBContext中的类....所以我必须添加类似的内容:

public class MovieDBContext : DbContext
{
    public DbSet<Movie> Movies { get; set; }
    public DbSet<UserProfile> User{get;set} 

}

问题是,在另一个项目中,我正在尝试更新AccountModel并尝试使用此解决方案,但它没有用....有没有人知道另一个解决方案?

4 个答案:

答案 0 :(得分:3)

我认为您遇到的是“连接”问题。 (请检查一下我之前做过的演练 - 以及连接链接)
Migration does not alter my table(关于连接问题)
Code first create tables

将它放入单个DbContext - 你真的不需要两个(至少我是这么认为)。你需要“调整”连接。

  

具体而言,您的UserContext已指定连接   (DefaultConnection)。另一个(电影......)没有 - 那个   表示另一个连接将命名为MovieDbContext - 并且它   试图在你的配置文件中找到它 - 如果它没有成功 - 它使用   你的默认'提供者'找到Db - 它会创建一个新的Db   那里。虽然你的UserContext可能已经在.config中有一个已定义的连接 - 而且那个工作正常。

将所有内容全部移至'UserContext' - 或调整连接。见附件

注意:

有多个DbContext-s就是所谓的多租户迁移 - 它目前尚不支持(对于EF5) - 并且即将推出EF6 Multiple Contexts per Database in EF6

它不能在同一个数据库中拥有“两个迁移表” - 因为每个迁移/上下文都需要它自己的。

对于'hack',您可以强制Add-Migration运行 - 通过执行类似Add-Migration -ConfigurationTypeName Test.Migrations.MovieConfiguration InitialMovie的操作 - 并单独执行另一个 - 但这不会在单个项目中运行(它' d抱怨待迁移或等等) - 如果你转移到两个不同的 - 你运行更新后你会点击'一个迁移表'墙。

另一个解决方案是关闭迁移(对于一个)但我没有尝试过 - 或运行两个连接到两个数据库的上下文 - 如果你想要的话你根本不想要在某种程度上“沟通”。无论哪种方式 - 这纯粹是为了'学术目的' - 它不适合你的情况。

答案 1 :(得分:0)

您应该将所有表放在一个DbContext类中。

一切都会正常运作。

答案 2 :(得分:0)

实体框架只会迁移一个DbContext。期。目前,没有办法解决这个问题。这非常简单明了,EF需要与一起工作的所有内容必须才能在这个单一环境中。

但是,这并不妨碍您在其他地方使用其他上下文用于不同目的。因此,在MovieDBContext中,请继续添加UserProfile实体集:

public DbSet<UserProfile> User { get; set; }

然后,在您的其他情况下,您只需要1)确保它们与同一个数据库交互,2)它们没有初始化策略,例如:

public class AccountsContext : DbContext
{
    public AccountsContext()
        : base("name=ConnectionStringNameHere")
    {
        Database.SetInitializer(null);
    }

    public DbSet<UserProfile> User { get; set; }
    ...
}

这将使EF将此上下文视为现有数据库的映射,因此它不会尝试创建数据库表,迁移等。所有这些都将通过您的主要上下文(MovieDbContext来完成情况)。

答案 3 :(得分:0)

您可以像这样使用enable Migration

Enable Migration -ContextTypeName UsersContext

或者您可以在public DbSet<UserProfile> User { get; set; }中定义MovieDBContext,如下所示:

public class MovieDBContext : DbContext
{
    public DbSet<Movie> Movies { get; set; }
    public DbSet<UserProfile> User{get;set} 

}

并以这种方式使用:

Enable Migration -ContextTypeName MovieDBContext