我正在学习本教程的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并尝试使用此解决方案,但它没有用....有没有人知道另一个解决方案?
答案 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