MVC5身份验证:在EntityFramework中使用多个上下文

4

我有一个MVC 5应用程序,使用默认的身份验证。 用户资料是我们模型的一部分,这意味着有几个类与UserInfo有外键关联。 有两个DbContext,一个用于模型,另一个用于UserInfo。

 public class ApplicationDbContext : IdentityDbContext<UserInfo>
    {
        public ApplicationDbContext()
            : base("Profile")
        {
        }

    }



 public class UserInfo : IdentityUser
        {
            public UserInfo ()
            {
                LibraryItems = new List<LibraryItem>();
                if (UserGroup == UserGroupEnum.ANALYST)
                {
                    Companies = new List<Company>();
                }
                DateCreate = DateTime.Now;
                DateUpdate = DateTime.Now;
                DateDelete = DateTime.Now;
            }

            [DisplayColumnInIndex]
            [DisplayName("Is Active ?")]
            public bool IsActive { get; set; }

            [Timestamp]
            public byte[] RowVersion { get; set; }

            //[ValidateFile(ErrorMessage = "Please select a PNG image smaller than 1MB")]
            //[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
            [Editable(false, AllowInitialValue = true)]
            public DateTime DateCreate { get; set; }

            //[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
            public DateTime DateUpdate { get; set; }

            //[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
            public DateTime DateDelete { get; set; }

            [DisplayColumnInIndex]
            public String Name { get; set; }
            [DisplayColumnInIndex]
            public String FirstName { get; set; }

            [DisplayColumnInIndex]
            public String Pseudo { get; set; }

            [DisplayColumnInIndex]
            public string PhoneNumber { get; set; }

            [DisplayColumnInIndex]
            public String Company { get; set; }

            [DisplayName("Name_Id")]
            [ForeignKey("FullName")]
            public int? NameId { get; set; }
            [DisplayColumnInIndex]
            public UserGroupEnum UserGroup { get; set; }

            [DisplayColumnInIndex]
            public UserStatusEnum UserStatus { get; set; }

            public virtual Name FullName { get; set; }
    }


public class Comment
{
       // more properties
        [DisplayName("UserInfoId")]
        [ForeignKey("UserInfo")]
        public virtual String UserInfoId { get; set; }
}

public class Like
{
      // more properties
        [DisplayName("UserInfoId")]
        [ForeignKey("UserInfo")]
        public virtual String UserInfoId { get; set; }
}

我的userInfo表还有外键关联到第二个DBContext的其他表。

设计我们的认证系统的最佳方式是什么?如何维护两个上下文之间的关系。

提前致谢。

1个回答

7
我最近想到的解决方案是,将ASP.NET身份数据和您的业务实体使用单一上下文进行管理:
public class DatabaseContext : IdentityDbContext<UserInfo>
{
    public virtual DbSet<Comment> Comments { get; set; } // Your business entities

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

请注意,DatabaseContext 继承自 IdentityDbContext<UserInfo>
这种方法存在一些权衡:例如,您的数据访问层应引用 Microsoft.AspNet.Identity.CoreMicrosoft.AspNet.Identity.EntityFramework;然而,如果您正在使用依赖注入或 Entity Framework 迁移,则在项目中拥有单个数据库上下文会使事情变得更加容易。

1
确实。如果您的身份用户实体与任何其他实体之间存在任何关系,则它们必须全部在同一上下文中。否则,您将不得不执行多个查询,例如从一个上下文获取用户,然后使用外键属性的值在另一个上下文中查找相关对象。这是可行的,但不是处理事物的最有效方式。 - Chris Pratt
不是这个原因。如果您的用户实体上有任何导航属性指向您想要放在单独上下文中的其他类型,那么它们实际上是属于您的用户类所在上下文的一部分。因为 EF 无法管理除非拥有所有涉及的实体关系,它基本上会为任何引用实体创建隐式的 DbSet,而没有它们自己的 DbSet。这意味着该上下文的迁移 创建这些相关实体的表,并且它们不能同时由另一个上下文管理。 - Chris Pratt
没有导航属性,你就无法进行延迟加载,所以你实际上只能使用一些值类型的“外键”属性来工作。 - Chris Pratt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接