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

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

public class Movie { public int ID { get; set; } [Required] public string Title { get; set; } } public class MovieDBContext : DbContext { public DbSet Movies { get; set; } } 

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

  public class UsersContext : DbContext { public UsersContext() : base("DefaultConnection") { } public DbSet 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 Movies { get; set; } public DbSet User{get;set} } 

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

我认为你所经历的是一个“连接”问题 。 (请检查一下我之前做过的演练 – 以及连接链接)
迁移不会改变我的表 (连接问题)
代码首先创建表

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

特别是您的UserContext指定了连接( DefaultConnection )。 另一个(电影…)没有 – 这意味着另一个连接将被命名为MovieDbContext – 它试图在你的配置文件中找到它 – 如果它没有成功 – 它使用你的默认’提供者’来找到Db – 它会在那里创建一个新的Db。 虽然你的UserContext可能已经在.config中有一个已定义的连接 – 而且这个连接有效。

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

注意:

拥有多个DbContext-s就是所谓的多租户迁移 – 它目前尚不支持(对于EF5) – 并且在EF6中为每个数据库提供EF6 多重上下文 。

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

对于’hack’,你可以强制Add-Migration运行 – 通过执行类似Add-Migration -ConfigurationTypeName Test.Migrations.MovieConfiguration InitialMovie – 并单独用于另一个 – 但这在单个项目中不起作用(它’抱怨正在等待迁移或者某些事情) – 如果你转移到两个不同的地方 – 一旦你运行更新,你就会点击’一个迁移表’。

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

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

一切都将正常工作。

entity framework只迁移一个DbContext。 期。 目前没有办法解决这个问题。 这意味着非常明确和简单,EF需要使用的所有内容必须在这个单一的上下文中。

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

 public DbSet User { get; set; } 

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

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

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

你可以像这样使用enable Migration

 Enable Migration -ContextTypeName UsersContext 

或者您可以定义public DbSet User { get; set; } public DbSet User { get; set; } 你的MovieDBContext就像这样:

 public class MovieDBContext : DbContext { public DbSet Movies { get; set; } public DbSet User{get;set} } 

并使用这种方式:

 Enable Migration -ContextTypeName MovieDBContext