0

我正在学习本教程 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

4 回答 4

3

我认为您所经历的是“连接”问题。(请查看我之前所做的演练 - 以及连接链接)
迁移不会改变我的表(用于连接问题)
代码首先创建表

把它放到一个 DbContext 中——你真的不需要两个(至少我是这么认为的)。当你这样做时,你只需要“调整”连接。

具体来说,您UserContext有一个指定的连接 ( DefaultConnection)。另一个(电影...)没有 - 这意味着将命名另一个连接MovieDbContext- 它会尝试在您的配置文件中找到它 - 如果它不成功 - 它使用您的默认“提供者”来查找 Db - 它在那里创建了一个新的数据库。虽然您的 UserContext 可能已经在 .config 中定义了一个连接 - 并且该连接有效。

只需将所有内容移至“UserContext” - 或调整连接。见附件

笔记:

拥有多个 DbContext-s 就是所谓的多租户迁移——目前还不支持(对于 EF5)——并且在 EF6 中为 EF6 Multiple Contexts per Database即将到来。

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

对于“黑客”,您可以强制Add-Migration运行 - 通过执行类似的操作Add-Migration -ConfigurationTypeName Test.Migrations.MovieConfiguration InitialMovie- 并单独为另一个项目运行 - 但这在单个项目中不起作用(它会抱怨迁移未决或其他事情) - 如果你移动到两个不同的 - 一旦你运行更新,你会碰到“一个迁移表”墙。

另一种解决方案是关闭迁移(对于一个),但我没有尝试过 - 或者运行连接到两个数据库的两个上下文 - 如果你想在两者之间“交流”,你并不真正想要。无论哪种方式-这纯粹是出于“学术目的”-不适合您的情况。

于 2013-04-03T18:29:36.980 回答
0

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

然后一切都会正常工作。

于 2013-04-03T17:50:20.773 回答
0

Entity Framework 只会迁移一个 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在本例中)完成。

于 2013-04-03T18:34:43.537 回答
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
于 2013-04-03T18:40:02.987 回答