移民没有像我希望的那样起作用…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并尝试此解决方案,但它没有工作....有人知道另一种解决方法吗?

移民没有像我希望的那样起作用…Asp.net EntityFramework

我认为你的经历是一个'连接'问题。(请查看我之前做的演练和连接链接)
迁移不会改变我的表(连接问题)
代码首先创建表

将其放入单个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