为数据层中的实体添加与 .NET Identity ApplicationUser 的关系

2024-02-01

我正在构建一个带有用户登录身份的 .NET MVC 应用程序。该应用程序有四层。

  • Web/UI 层,参考了我的域和服务层
  • 领域层,没有引用
  • 服务层,参考了我的数据层和领域层
  • 数据层,参考了我的领域层

我想要我的AppUser类与我的数据层中的实体之一有关系,Company.

The AppUser类驻留在我的域层中,并且继承自身份用户。我放置我的原因AppUser我的域层中的类是因为我需要从我的 Web/UI 层访问它身份配置需要上课。

但是,当我现在想要添加与数据层中的实体的关系时,事情对我来说变得很棘手。

我希望它看起来像 AppUser 类:

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using System.Security.Claims;
using System.Threading.Tasks;

namespace ITKA.Domain.Classes
{
    public class AppUser : IdentityUser
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string ContactNumber { get; set; }
        public int CompanyId { get; set; }
        public Company Company { get; set; }

        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<AppUser> manager)
        {
            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
            return userIdentity;
        }

        public void Dispose()
        {

        }
    }
}

公司类别如下:

using ITKA.Data.Interfaces;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace ITKA.Data.Entities
{
    [Table("CompanyTbl")]
    public class Company : IEntity
    {
        [Key]
        public int Id { get; set; }

        [StringLength(100)]
        public string CompanyName { get; set; }

        public virtual ICollection<InventoryItem> InventoryItems { get; set; }
    }
}

IdentityConfig 类,如其外观所示

using System;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.Owin;
using Microsoft.Owin.Security;
using ITKA.Domain.Classes;
using ITKA.Domain.Interfaces;

namespace ITKA.Web
{
    public class AppUserManager : UserManager<AppUser>
    {
        public AppUserManager(IUserStore<AppUser> userStore)
            : base(userStore)
        {
        }

        public static AppUserManager Create(IdentityFactoryOptions<AppUserManager> options, IOwinContext context) 
        {
            var userStore = new UserStore<AppUser>((IdentityDbContext<AppUser>)context.Get<IITKAContext>());
            var manager = new AppUserManager(userStore);

            manager.UserValidator = new UserValidator<AppUser>(manager)
            {
                AllowOnlyAlphanumericUserNames = false,
                RequireUniqueEmail = true
            };

            manager.PasswordValidator = new PasswordValidator
            {
                RequiredLength = 8,
                RequireNonLetterOrDigit = false,
                RequireDigit = true,
                RequireLowercase = true,
                RequireUppercase = true
            };

            manager.UserLockoutEnabledByDefault = false;
            manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5);
            manager.MaxFailedAccessAttemptsBeforeLockout = 5;

            return manager;
        }
    }

    public class AppSignInManager : SignInManager<AppUser, string>
    {
        public AppSignInManager(AppUserManager userManager,
            IAuthenticationManager authManager)
            : base(userManager, authManager) { }

        public static AppSignInManager Create
            (IdentityFactoryOptions<AppSignInManager> options, IOwinContext context)
        {
            return new AppSignInManager(context.Get<AppUserManager>(),
                context.Authentication);
        }
    }

    public class AppRoleManager : RoleManager<IdentityRole>
    {
        public AppRoleManager(RoleStore<IdentityRole> roleStore)
            : base(roleStore) { }

        public static AppRoleManager Create(IOwinContext context)
        {
            var roleStore = new RoleStore<IdentityRole>
                ((IdentityDbContext<AppUser>)context.Get<IITKAContext>());

            return new AppRoleManager(roleStore);
        }
    }
}

我不知道如何放置AppUser我的数据层中的类,以便身份配置能够“到达”它,因为这些层彼此没有引用。

我试图移动我的AppUser类到我的数据层并使其使用我添加到域层的接口,IAppUser。我变了身份配置使用我的界面而不是我的类,但这给了我很多波浪线。

我遇到的第一个问题是,之间没有隐式转换IAppUser and IUser,所以我做了我的IAppUser接口继承自IUser并且解决了一些问题身份配置 class.

但在某些地方它仍然抱怨之间没有隐式转换IAppUser和班级身份用户。我无法让我的接口从类继承,所以实验就结束了。

我不知道是否有办法向我添加关系AppUser也许可以通过域层中的接口将类映射到数据层中的实体?这感觉对我来说不起作用,因为我认为 EF 需要隐式地知道它与哪个类/实体建立了关系。由于许多不同的类都可以从接口继承,这对我来说是不可能的。我错了吗?

或者我可以在我的AppUser类属性与接口和 EF 会创建关系吗?如果我的Company类将使用名为的接口ICompany and my AppUser类具有如下属性:

public ICompany Company { get; set; }

它会与公司建立关系吗?

我遇到麻烦时身份配置需要我的 DbContext 类,它也驻留在我的数据层中,但我可以通过使用域层中的接口来解决这个问题。

我真的被困在这里,我不知道如何解决这个问题。我很感谢任何帮助。


我发现如果您将数据层添加到域层引用中,您首先会遇到循环引用的问题。您不希望域和数据相互引用。

删除此引用:

  • 数据层,参考了我的领域层

并引用域层中的数据层:

  • 领域层,没有引用

现在它应该看起来像这样。

Web -> Domain  -> Data

    -> Service -> Data
               -> Domain
  1. Web图层参考Domain and Service层。
  2. Domain参考了Data layer.
  3. Service图层引用Data and Domain layers

请注意数据层是最低的参考,因此数据层将not有什么参考资料。

保持你的AppUser领域层中的类。

由于第 2 点,域层引用了数据层,您现在可以使用Company entity.

应用程序用户.cs

using ITKA.Data.Entities;
//or just use ITKA.Data.Entities.Company

namespace ITKA.Domain.Classes 
{
    public class AppUser : IdentityUser
    {
        ....
        public virtual Company Company { get; set; }
        ....
    }
}

现在对于 Web 层 - 由于第 1 点,Web 引用了域层,允许它访问AppUser class

身份配置.cs

using ITKA.Domain.Classes;
//or just use ITKA.Domain.Classes.AppUser;

namespace ITKA.Web 
{
    public class AppUserManager : UserManager<AppUser>
    {
        ....
        public virtual Company Company { get; set; }
        ....
    }
}

您最喜欢的还必须将 IdentityDbContext 保留在域层中,并将实体 DbContext 保留在数据层中。不过,两者仍然可以指向相同的连接字符串。

我希望这有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为数据层中的实体添加与 .NET Identity ApplicationUser 的关系 的相关文章

  • 当我单击 C# 中的“取消”按钮时重定向到新页面(Web 部分)

    Cancel button tc new TableCell btnCancel new Button btnCancel Text Cancel btnCancel Click new EventHandler btnCanel Clic
  • 处理 fanart.tv Web 服务响应 JSON 和 C#

    我正在尝试使用 fanart tv Webservice API 但有几个问题 我正在使用 Json Net Newtonsoft Json 并通过其他 Web 服务将 JSON 响应直接反序列化为 C 对象 这里的问题是元素名称正在更改
  • 使用实体框架从集合中删除项目

    我正在使用DDD 我有一个 Product 类 它是一个聚合根 public class Product IAggregateRoot public virtual ICollection
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • TextBox 焦点的 WinForms 事件?

    我想添加一个偶数TextBox当它有焦点时 我知道我可以用一个简单的方法来做到这一点textbox1 Focus并检查布尔值 但我不想那样做 我想这样做 this tGID Focus new System EventHandler thi
  • ZLIB 解压缩

    我编写了一个小型应用程序 该应用程序应该解压缩以 gzip deflate 格式编码的数据 为了实现这一点 我使用 ZLIB 库 使用解压缩功能 问题是这个功能不起作用 换句话说 数据不是未压缩的 我在这里发布代码 int decompre
  • 如何在 VS 中键入时显示方法的完整文档?

    标题非常具有描述性 是否有任何扩展可以让我看到我正在输入的方法的完整文档 我想查看文档 因为我可以在对象浏览器中看到它 其中包含参数的描述和所有内容 而不仅仅是一些 摘要 当然可以选择查看所有覆盖 它可能是智能感知的一部分 或者我不知道它并
  • 为什么密码错误会导致“填充无效且无法删除”?

    我需要一些简单的字符串加密 所以我编写了以下代码 有很多 灵感 来自here http www codeproject com KB security DotNetCrypto aspx create and initialize a cr
  • 为什么 std::allocator 在 C++17 中丢失成员类型/函数?

    一边看着std 分配器 http en cppreference com w cpp memory allocator 我看到成员 value type pointer const pointer reference const refer
  • 通过不同 DLL 或 EXE 中的指针或引用访问 STL 对象时发生访问冲突

    我在使用旧版 VC6 时遇到以下问题 我只是无法切换到现代编译器 因为我正在处理遗留代码库 http support microsoft com kb 172396 http support microsoft com kb 172396
  • std::bind 重载解析

    下面的代码工作正常 include
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • 如何检测 C# 中该字典键是否存在?

    我正在使用 Exchange Web 服务托管 API 和联系人数据 我有以下代码 即功能性的 但并不理想 foreach Contact c in contactList string openItemUrl https service
  • 将 HTML 表格导出到 Excel

    我在 ASP NET MVC 视图页面上有 HTML 表 现在我必须将该表导出到 Excel 1 我使用部分视图 Inquiries ascx 来显示数据库中的表数据 使用LINQ to Entity 2 我还使用了 UITableFilt
  • 我应该在应用程序退出之前运行 Dispose 吗?

    我应该在应用程序退出之前运行 Dispose 吗 例如 我创建了许多对象 其中一些对象具有事件订阅 var myObject new MyClass myObject OnEvent OnEventHandle 例如 在我的工作中 我应该使
  • 以编程方式使用自定义元素创建网格

    我正在尝试以编程方式创建一个网格 并将自定义控件作为子项附加到网格中 作为 2x2 矩阵中的第 0 行第 0 列 为了让事情变得更棘手 我使用了 MVVM 设计模式 下面是一些代码可以帮助大家理解这个想法 应用程序 xaml cs base
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

    当从查询字符串中提取的模型将字典作为其属性之一时 Swagger 会生成不正确的 URL 如何告诉 Swagger 更改 URL 中字典的格式或手动定义输入参数模式而不自动生成 尝试使用 Swashbuckle 和 NSwag 控制器 pu
  • 从类模板参数为 asm 生成唯一的字符串文字

    我有一个非常特殊的情况 我需要为类模板中声明的变量生成唯一的汇编程序名称 我需要该名称对于类模板的每个实例都是唯一的 并且我需要将其传递给asm关键字 see here https gcc gnu org onlinedocs gcc 12
  • 如何确定母版页中正在显示哪个子页?

    我正在母版页上编写代码 我需要知道正在显示哪个子 内容 页面 我怎样才能以编程方式做到这一点 我用这个 string pageName this ContentPlaceHolder1 Page GetType FullName 它以 AS
  • 如何使用 std::array 模拟 C 数组初始化“int arr[] = { e1, e2, e3, ... }”行为?

    注意 这个问题是关于不必指定元素数量并且仍然允许直接初始化嵌套类型 这个问题 https stackoverflow com questions 6111565 now that we have stdarray what uses are

随机推荐

  • 多生产者多消费者多线程Java

    我正在尝试生产者 消费者问题的多个生产者 多个消费者用例 我使用 BlockingQueue 在多个生产者 消费者之间共享公共队列 下面是我的代码 Producer import java util concurrent BlockingQ
  • 构建GCC:bootstrap有哪些优点和缺点?

    我了解引导编译器构建的作用 但我不了解普通用户的优点和缺点 我认为对于 GCC 维护者来说是有价值的 配置GCC时 有两个选项 enable bootstrap and disable bootstrap 据我了解 对于普通编译器构建 en
  • SQL删除性能

    delete from a A where a ID 132 A表包含大约5000条记录 A ID是A表的主键 但是删除需要很长时间 有时它也会超时 该表包含三个索引 并由三个外键引用 谁能解释一下为什么即使我们是基于主键删除 它仍然需要很
  • 如何将所有请求修改为单个文件而不导致无限循环

    如何将所有请求发送到 www myurl com ANYTHING 并将它们全部发送到 www myurl com index php 我发现我可以通过以下方式发送所有内容 RewriteRule index php R Permanent
  • 无法在 Firefox 3.6 中的表格上获取最小高度

    我有一个问题 最小高度不适用于我绝对定位的桌子 但是 我可以使用高度在 IE 6 中工作 据我所知 IE 6 将高度视为最小高度 关于我如何让它发挥作用的任何线索 table cellspacing 0 style width 100 mi
  • Wii MotionPlus 支持

    我正在开发一个与Wiimote http en wikipedia org wiki Wii Remote 到目前为止我一直在使用维尤斯图书馆 http www wiiuse net 效果很好 然而 wiiuse 不支持运动加 http e
  • 定义 TypeScript 回调类型

    我在 TypeScript 中有以下类 class CallbackTest public myCallback public doWork void doing some work this myCallback calling call
  • 对象化关系:一对多,我可以有效地做到这一点吗?

    我对 Objectify 还很陌生 我有一个简单的问题 做某事的最好方法 假设我有一个允许人们发送和接收的应用程序 消息 为简单起见 请考虑电子邮件 当我的应用程序加载时 我没有 想要加载来自每个联系人的每条消息 向给定用户发送消息 那将是
  • 跨安装的 ios 唯一标识符

    我们需要唯一地标识该设备 并且它在安装 重新安装 时必须相同 到目前为止 我们一直在使用存储在钥匙串中的标识符 因此它在安装过程中仍然存在 现在 在 10 3 beta 版中 卸载应用程序时 钥匙串会自动删除 参考 https forums
  • Eclipse Neon CDT 运行配置未设置环境变量

    我刚刚从 Eclipse Kepler 升级到 Neon 3 发现除非在调试器下运行 否则在运行配置中设置环境变量不起作用 截至 2017 年 2 月 6 日 这被确定为 Neon 3 中的回归问题 但我一直无法找到解决方案 有其他人看到这
  • 在绘图文本过滤器中正确转义文本

    根据文件 应该用斜杠转义 但当我逃脱时 未添加文本 有错误消息说Stray near 但这是什么意思以及我该如何解决它 命令和输出 usr bin ffmpeg y i home www 255871 mov af aresample as
  • 为什么 Guava 中不推荐使用 Files.deleteDirectoryContents() ?

    在 Guava 10 中 Google 已弃用文件 deleteDirectoryContents https google github io guava releases 10 0 api docs com google common
  • GADT 上的模式匹配失败

    我更多地使用 ReasonML 并发现了模式匹配type t从以下示例开始 无法处理该错误 错误 此模式与 t float 类型的值匹配 但需要一个与 t int 类型的值匹配的模式 float 类型与 int 类型不兼容 type t a
  • Pandas str 和 object 类型的区别

    Numpy 似乎区分了str and object类型 例如我可以这样做 gt gt gt import pandas as pd gt gt gt import numpy as np gt gt gt np dtype str dtyp
  • 从文件读取清单时出现异常。 Microsoft Word 插件 VSTO

    我正在尝试创建一个 Microsoft Word 插件 每次保存 Word 文档 自动保存或手动保存 时 该插件都会添加并提交到 git 存储库 当我从 Visual Studio 调试模式 中运行程序时 我已经能够获得我想要的功能 当我发
  • constexpr 函数在多个模块中共享

    当我使用 constexpr 函数时 我注意到一个奇怪的行为 我将代码简化为一个简化的示例 从两个不同的翻译单元 模块 A 和 B 调用两个函数 include
  • IllegalStateException: 当前不在 FragmentManager 中

    我知道这听起来像是重复的FragmentStatePagerAdapter IllegalStateException 当前不在 FragmentManager 中 https stackoverflow com questions 112
  • 在我的 Node 应用程序中使用 SSH 连接到 MongoDB

    我的数据库使用 DigitalOcean 我正在尝试在我的节点应用程序中连接到它 我发现了一个名为的 npmtunnel ssh但是我无法连接到它 我的代码如下 它说数据库连接成功 但是当我执行console log mongoose 它显
  • 小程序未显示完整

    我刚刚创建了一个小程序 public class HomeApplet extends JApplet private static final long serialVersionUID 7650916407386219367L Call
  • 为数据层中的实体添加与 .NET Identity ApplicationUser 的关系

    我正在构建一个带有用户登录身份的 NET MVC 应用程序 该应用程序有四层 Web UI 层 参考了我的域和服务层 领域层 没有引用 服务层 参考了我的数据层和领域层 数据层 参考了我的领域层 我想要我的AppUser类与我的数据层中的实