移民没有像我希望的那样起作用…Asp.net EntityFramework
本文关键字:起作用 Asp EntityFramework net 我希望 | 更新日期: 2023-09-27 18:07:12
我正在学习这个教程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给我的Account Model:
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并尝试此解决方案,但它没有工作....有人知道另一种解决方法吗?
我认为你的经历是一个'连接'问题。(请查看我之前做的演练和连接链接)
迁移不会改变我的表(连接问题)
代码首先创建表
将其放入单个DbContext -您实际上不需要两个(至少我认为是这样)。你只需要"调整"连接。
特别是您的
UserContext
有一个指定的连接(DefaultConnection
)。另一部(电影……)则没有意味着另一个连接将被命名为MovieDbContext
-它尝试在配置文件中找到它-如果没有成功-它使用您的默认"提供者"来查找Db -并创建一个新的Db在那里。虽然您的UserContext可能已经在.config中定义了一个连接,并且这个连接可以工作。
只需移动到'UserContext' -或调整连接。见附件
注意:
拥有多个DbContext-s就是所谓的多租户迁移——目前还不支持(对于EF5)——EF6将在EF6中支持每个数据库的多个上下文。
它不能在同一个数据库中有"两个迁移表"——因为每个迁移/上下文都需要它自己的。
对于一个"黑客",你可以强迫Add-Migration
运行-通过做Add-Migration -ConfigurationTypeName Test.Migrations.MovieConfiguration InitialMovie
之类的事情-并单独为另一个-但这不会在单个项目中工作(它会抱怨迁移未决或其他东西)-如果你移动到两个不同的-你会撞到"一个迁移表"墙一旦你运行更新。
另一个解决方案是关闭迁移(一个),但我没有尝试过-或者运行两个连接到两个数据库的上下文-如果你想在两者之间进行"通信",你真的不想要。无论哪种方式——这纯粹是出于"学术目的"——并不适合你的情况。
你应该把所有的表放在一个单独的DbContext
类中。
实体框架将只迁移一个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
)完成。
您可以这样使用enable Migration
:
Enable Migration -ContextTypeName UsersContext
或者你可以在MovieDBContext
中定义public DbSet<UserProfile> User { get; set; }
,像这样:
public class MovieDBContext : DbContext
{
public DbSet<Movie> Movies { get; set; }
public DbSet<UserProfile> User{get;set}
}
,这样使用:
Enable Migration -ContextTypeName MovieDBContext