【问题标题】:ASP.NET MVC Entity Framework Join Entities Across contexts and assembliesASP.NET MVC 实体框架跨上下文和程序集连接实体
【发布时间】:2015-11-19 06:16:34
【问题描述】:

我有一个 MVC 5 项目,我将我的模型分离到一个单独的项目中,比如 Project.Models。 Identity (ApplicationUser) 模型及其 DbContext 仍在主项目中,如默认 MVC 5 项目脚手架中所示。 Project.Models 程序集中的实体之一必须具有一个属性,即 ApplicationUsers 列表。

现在我开始认为将实体模型分离到一个单独的项目中并不是一个好主意,因为现在我在单独的上下文和程序集中拥有实体模型和身份模型。

如果 ApplicaitonUsers 列表位于单独的程序集中,我如何使这些列表成为实体对象的一部分?我应该将项目合并回一个程序集和 DbContexgt 还是有一种简单的方法来解决这个问题?我无法在 Project.Models 的 DbContext 中定义 DbSet<MainProject.ApplicationUser>,因为这意味着循环引用。

谢谢。

【问题讨论】:

  • 出于可移植性目的以及许多其他优势,将数据层拉出到另一个项目中是一个很好的约定。您将用户身份模型排除在此抽象之外的原因是什么?它们与您的其他域模型共享相同的数据源,对吗?
  • 原因是 Identity 模型与 HTTP 和其他网络内容紧密集成,例如设置身份验证 cookie 等,因此它需要所有这些引用,而纯 POCO 模型不需要。 . 虽然我必须承认我仍然不完全了解这种整合的深度,但我可能错了。
  • 你是对的,身份是紧密耦合的,分离出来很痛苦。一种解决方法是在您的模型中创建一个 ApplicationUser 类(副本)并在您的 DbContext 中执行 DbSet。然后,您可以在模型中添加参考。为我们工作。

标签: asp.net asp.net-mvc entity-framework asp.net-identity


【解决方案1】:

您可以在模型项目中添加与身份相关的包Microsoft.AspNet.IdentityMicrosoft.AspNet.Identity.EntityFramework,并将ApplicationUser 类移动到模型项目中。

您还可以像这样在 ApplicationUser 中添加配置文件数据:

public class ApplicationUser : IdentityUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser, string> manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);

        // Add custom user claims here

        return userIdentity;
    }
}

此外,要使其成为单个 DBContext,您可以直接从 dbcontext 类中的 IdentityDbContext 继承。像这样:

public partial class MyDBContext : IdentityDbContext<ApplicationUser>
{
    public MyDBContext()
        : base("name=DefaultConnection", throwIfV1Schema: false)
    {
    }
}

这样您就不需要在上下文类中定义DbSet&lt;MainProject.ApplicationUser&gt;

【讨论】:

  • +1 用于突出显示此方法,但我希望模型程序集完全没有与 Web 相关的内容。谢谢
  • 看起来这不可能以完全干净的方式完成 - 需要做出一些妥协,要么通过复制类 def 或将 Web 引用拖到仅模型程序集中。
猜你喜欢
  • 2010-09-25
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-26
  • 1970-01-01
相关资源
最近更新 更多