迁移不按我的意愿工作… 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
public DbSet
你的MovieDBContext
就像这样:
public class MovieDBContext : DbContext { public DbSet Movies { get; set; } public DbSet User{get;set} }
并使用这种方式:
Enable Migration -ContextTypeName MovieDBContext