如何让asp.net成员提供者和实体框架共享同一个数据库

Posted

技术标签:

【中文标题】如何让asp.net成员提供者和实体框架共享同一个数据库【英文标题】:How to make asp.net member provider and entity framework share the same database 【发布时间】:2012-06-01 02:49:43 【问题描述】:

我有一个干净的 MVC 3 项目,并为安全帐户使用 SqlCe 成员资格提供程序。

当我在连接字符串中指定成员资格提供程序和实体框架使用相同的“数据库”时,我会在 EF Code First 模型中得到一个表未找到错误

<connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=|DataDirectory|db.sdf" providerName="System.Data.SqlServerCE.4.0" />
    <add name="SqlDbContext" connectionString="Data Source=|DataDirectory|db.sdf" providerName="System.Data.SqlServerCE.4.0" />
  </connectionStrings>

但是,如果我指定不同的数据库名称,那么我会完美地工作 - 尽管它会创建两个单独的 SDF 文件。以下连接字符串有效:

<connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=|DataDirectory|aspnet.sdf" providerName="System.Data.SqlServerCE.4.0" />
    <add name="SqlDbContext" connectionString="Data Source=|DataDirectory|db.sdf" providerName="System.Data.SqlServerCE.4.0" />
  </connectionStrings>

为什么它只在我指定两个单独的 SDF 表时才有效?以及如何将单个 SDF 数据库用于会员提供者和 ef 模型?

【问题讨论】:

是否手动为 EF 创建数据库表? 不,我使用的是代码优先方法,因此希望自动创建表 - 事实上,这些表是使用第二个配置自动创建的 【参考方案1】:

您的问题的原因是用于创建表的代码优先内部逻辑。除 EF 5.0 RC 之外的所有版本都将仅与数据库一起创建表。如果数据库存在并且您没有使用能够删除数据库的初始化策略,则不会创建您的表。反过来,如果您使用删除数据库的策略,您将丢失您的成员表。

您可以创建custom database initializer 在现有数据库中创建表或自定义数据库初始化程序,它将执行 DDL 脚本以在 Seed 方法中创建成员表,或者您可以尝试EF 5.0 RC,它应该能够在现有数据库中创建表 -开箱即用。

或者,您也可以让代码先创建数据库,然后手动添加成员表,但每次您让代码先重新创建数据库时(不使用迁移时),它都会删除您的成员表,您必须再次手动添加它们.

【讨论】:

【参考方案2】:

我正在为我正在开发的网站滚动我自己的会员/角色/个人资料管理员,并遇到了这个问题。这个问题我有点晚了,但是如果您仍在处理此问题,此链接应该对您有所帮助: http://imar.spaanjaars.com/563/using-entity-framework-code-first-and-aspnet-membership-together

HTH

【讨论】:

以上是关于如何让asp.net成员提供者和实体框架共享同一个数据库的主要内容,如果未能解决你的问题,请参考以下文章

实体框架和 ASP.NET 的最佳实践

ASP.NET MVC3 和实体框架代码优先架构

ASP.NET:如何在 Web 应用程序之间共享资源(成员资格、库)

Asp.net 如何使用实体框架删除一对多的对象

如何在 Asp.net MVC 和实体框架中分页时应用过滤器?

如何在使用实体框架时获取所有用户角色