【问题标题】:using same dbContext for Identity and other db entities对身份和其他数据库实体使用相同的 dbContext
【发布时间】:2013-11-28 22:22:37
【问题描述】:

我有一个使用 EntityFramework edmx 模型的应用程序,我希望能够为我的身份类和实体类使用相同的 dbContext。有人提出了Similar Query,但我无法让它们兼容。

我改变了 EF 上下文类中的类定义如下

    public partial class MyDbContext : IdentityDbContext<AspNetUser>
    {
    }

我的身份用户为

public partial class AspNetUser : IdentityUser
{
}

但是当我尝试登录或注册时出现错误

实体类型 AspNetUser 不是当前模型的一部分 上下文

【问题讨论】:

  • 一般来说,您不想为您的应用程序模型和身份模型使用相同的 dbContext,原因是无法控制提交的异步性质,例如来自identity 可能会在使用相同上下文的业务逻辑中间保存更改,但是如果您的模型也是代码优先,那么您应该能够合并两者

标签: c# entity-framework visual-studio-2013 asp.net-mvc-5 asp.net-identity


【解决方案1】:

我最近提出的解决方案是为 ASP.NET 身份数据和您的业务实体使用单一上下文:

public class DatabaseContext : IdentityDbContext<UserInfo>
{
    public virtual DbSet<Comment> Comments { get; set; } // Your business entities

    public DatabaseContext()
    : base("name=DatabaseContext")
     {
     }
}

请注意,DatabaseContext 继承自 IdentityDbContext。

这种方法有一些取舍:例如,您的数据访问层应该引用 Microsoft.AspNet.Identity.Core 和 Microsoft.AspNet.Identity.EntityFramework;但是,如果您使用依赖注入或实体框架迁移,则在您的项目中拥有单个数据库上下文会使事情变得更容易。

【讨论】:

    【解决方案2】:

    由于身份工作方式的异步性质,我建议单独使用这些 dbContext。您希望对应用程序上下文拥有绝对的控制权。

    出于这个原因,我通常使用来自应用程序上下文的相同连接来注入身份 dbContext,但有两个单独的实例。

    此外,如果您希望您的应用程序 dbContext 优先于代码以外的任何内容,则无法与标识 dbContext 合并。

    【讨论】:

    • 那么您将使用什么方法从当前登录的用户导航到 EF 模型中的其他链接实体。即当我 userA 单击链接以加载新页面时,控制器方法有一个 User Property 显示他的登录用户,我希望能够执行 User.Orders.First().Id 例如
    • 根据您的关系设置方式,您应该针对您的应用程序模型存储库并使用用户 ID 加载订单,例如 dbContext.GetDbSet&lt;Order&gt;.Where(o =&gt; o.UserId == User.Identity.GetUserId()).Select(o =&gt; o.Id).First() 它仅取决于您的模型
    • 虽然我大部分时间都喜欢使用 Code First。但是,有时我将 POCO 反转一个有数据的表比编写种子方法更容易。
    猜你喜欢
    • 2015-11-26
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 2018-03-30
    • 1970-01-01
    相关资源
    最近更新 更多