1

我正在使用 asp.net mvc 4 进行编程,并且我使用的是在您选择 Internet 应用程序模板时默认创建的模板,因此它带有一个模型,即 Models 文件夹下的 AccountModels.cs,它的初始化如下所示(AccountModels.cs):

public class UsersContext : DbContext
{
    public UsersContext()
        : base("DefaultConnection")
    {
    }

    public DbSet<UserProfile> UserProfiles { get; set; }
}

(...) // tables definition

但我不需要添加到默认创建的相同数据库中一些存储我的应用程序配置的表,但我不想在创建的默认文件 AccountModels.cs 中创建我的配置表,我想将它们分开以知道它们与应用程序相关配置,所以我在 Models 文件夹下创建了另一个名为 AppConfigModels.cs 的文件,其中包含这个(其中的一部分):

public class ConfigContext : DbContext
{
    public ConfigContext()
        : base("DefaultConnection")
    {
    }

    public DbSet<Config1> Config1{ get; set; }
    public DbSet<Config2> Config2{ get; set; }
}

(...) // tables definition

这与默认命名空间在同一个命名空间中,我希望它指向同一个数据库,因为我希望在同一个数据库中创建我的应用程序配置表。

默认情况下,如果创建了实体框架,则不会更新数据库,因此我重命名现有数据库或删除,以便再次创建实体框架(我知道如果模型更改,我可以将行为更改为实体框架更新数据库,但在这种情况下,我已经继续如解释的那样)。因此它在文件 InitializeSimpleMembershipAttribute.cs 中的 OnActionExecuting 开始并遵循:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public sealed class InitializeSimpleMembershipAttribute : ActionFilterAttribute
{
    private static SimpleMembershipInitializer _initializer;
    private static object _initializerLock = new object();
    private static bool _isInitialized;

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // Ensure ASP.NET Simple Membership is initialized only once per app start
        LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock); <---- HERE IT CRASHES
    }

    (...)
}

引发的错误是:

The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588

如何摆脱这个?我想将我的表分隔在不同的文件中,并指向具有另一个上下文的同一个数据库。

4

3 回答 3

4

Entity Framework 团队的 Arthur Vickers 推荐以下模式……

无需在 app.config 文件中为多个上下文指定单独的连接字符串,只需设置一个字符串并为其指定一个通用名称。

<connectionStrings>
    <add name="MyDBContext" connectionString="Your conn string here" providerName="System.Data.SqlClient" />
</connectionStrings>

然后创建一个将使用连接字符串的基本上下文类:

using System.Data.Entity; 

    namespace DataLayer
    {
        public class BaseContext<TContext> : DbContext where TContext : DbContext
        {
            static BaseContext()
            {
                Database.SetInitializer<TContext>(null); 
            }
            protected BaseContext()
                : base("name=MyDBContext")
            {
            }

        }
    }

现在,在每个上下文中继承这个基本行为(例如):

namespace DataLayer.Models
{
    public class OrderContext : BaseContext<OrderContext>

…

namespace DataLayer.Models
{
    public class ProductContext : BaseContext<ProductContext>
…
于 2013-11-26T11:57:32.700 回答
1

使用 EF5,如果将上下文放在单独的项目中,则可以使用多个迁移。

使用 EF6 它支持DB 的多个上下文。EF4/5 不喜欢在同一个项目中指向同一个数据库的多个上下文。

于 2013-09-20T14:16:53.067 回答
0

数据库是否设置了 UsersProfile 表?如果没有,SimpleMembership 将不会初始化。架构如下(不确定此查询是否会运行):

CREATE TABLE [dbo].[UserProfile](
[UserId] [int] IDENTITY(1,1) NOT NULL,
[UserName] [varchar](75) NOT NULL,
)
于 2013-09-20T14:10:29.353 回答