- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 Audit.NET ,一个开源审计框架,它为 Entity Framework 和 DbContext
提供扩展这里:AuditDbContext.cs
// Implements DbContext
public abstract partial class AuditDbContext : DbContext
我想在我的项目中使用这个 Entity Framework 扩展实现 Audit.NET,因为它会自动执行很多我需要手动执行的步骤(我可以手动使用 Audit.NET,无需 Entity Framework 扩展)。我遇到的问题是我的解决方案存储库实现了 IdentityDbContext
这当然是 DbContext
的实现还有。
// Implements IdentityDbContext
public class MyDataContext : IdentityDbContext<ApplicationUser>
{
public MyDataContext() : base("DefaultConnection") { }
...
不存在AuditDbContext
实现 IdentityDbContext
.
我似乎想不出一种干净的方法来将这两者混合在一起并让我的存储库使用 AuditDbContext
,特别是考虑到 AuditDbContext
有 protected 构造函数,而且这两个 DbContext
和 IdentityDbContext
有protected
方法。我试图创建一个名为 AuditIdentityDbContext
的组合那有 private
每个上下文的副本,但我无法通过这样做来实现它们的所有接口(interface)。
似乎所有 3 DbContext
由于 protected
需要继承上述类型成员。在我的职业生涯中,我第一次觉得多重继承在这种情况下实际上可能有所帮助,但鉴于这不可能,最好的选择是什么?
我唯一能想到的就是创建一个继承自 AuditDbContext
的新类或 IdentityDbContext<TUser>
并手动实现剩下的任何东西以匹配另一个的功能。虽然没有要实现的接口(interface)类,所以我很确定这是行不通的。我觉得我一定是忽略了什么。
最佳答案
哎哟!
但你还是可以找到出路的。 IdentityDbContext
没有什么特别之处,甚至没有接口(interface)!所以您需要做的就是告诉您自己的 DbContext 有关用户和角色的信息并添加一些验证。
IdentityDbContext
的内容是这样的:
public virtual IDbSet<TUser> Users { get; set; }
public virtual IDbSet<TRole> Roles { get; set; }
public bool RequireUniqueEmail { get; set; } // this might not be important for you
用您自己的 ApplicationUser
和 ApplicationRole
替换通用参数(这两个类都可以继承自 Identity-provided 类)
并添加或混合您自己的方法:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
if (modelBuilder == null)
{
throw new ArgumentNullException("modelBuilder");
}
// Needed to ensure subclasses share the same table
var user = modelBuilder.Entity<TUser>()
.ToTable("AspNetUsers");
user.HasMany(u => u.Roles).WithRequired().HasForeignKey(ur => ur.UserId);
user.HasMany(u => u.Claims).WithRequired().HasForeignKey(uc => uc.UserId);
user.HasMany(u => u.Logins).WithRequired().HasForeignKey(ul => ul.UserId);
user.Property(u => u.UserName)
.IsRequired()
.HasMaxLength(256)
.HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("UserNameIndex") { IsUnique = true }));
// CONSIDER: u.Email is Required if set on options?
user.Property(u => u.Email).HasMaxLength(256);
modelBuilder.Entity<TUserRole>()
.HasKey(r => new { r.UserId, r.RoleId })
.ToTable("AspNetUserRoles");
modelBuilder.Entity<TUserLogin>()
.HasKey(l => new { l.LoginProvider, l.ProviderKey, l.UserId })
.ToTable("AspNetUserLogins");
modelBuilder.Entity<TUserClaim>()
.ToTable("AspNetUserClaims");
var role = modelBuilder.Entity<TRole>()
.ToTable("AspNetRoles");
role.Property(r => r.Name)
.IsRequired()
.HasMaxLength(256)
.HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("RoleNameIndex") { IsUnique = true }));
role.HasMany(r => r.Users).WithRequired().HasForeignKey(ur => ur.RoleId);
}
和
protected override DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry,
IDictionary<object, object> items)
{
if (entityEntry != null && entityEntry.State == EntityState.Added)
{
var errors = new List<DbValidationError>();
var user = entityEntry.Entity as TUser;
//check for uniqueness of user name and email
if (user != null)
{
if (Users.Any(u => String.Equals(u.UserName, user.UserName)))
{
errors.Add(new DbValidationError("User",
String.Format(CultureInfo.CurrentCulture, IdentityResources.DuplicateUserName, user.UserName)));
}
if (RequireUniqueEmail && Users.Any(u => String.Equals(u.Email, user.Email)))
{
errors.Add(new DbValidationError("User",
String.Format(CultureInfo.CurrentCulture, IdentityResources.DuplicateEmail, user.Email)));
}
}
else
{
var role = entityEntry.Entity as TRole;
//check for uniqueness of role name
if (role != null && Roles.Any(r => String.Equals(r.Name, role.Name)))
{
errors.Add(new DbValidationError("Role",
String.Format(CultureInfo.CurrentCulture, IdentityResources.RoleAlreadyExists, role.Name)));
}
}
if (errors.Any())
{
return new DbEntityValidationResult(entityEntry, errors);
}
}
return base.ValidateEntity(entityEntry, items);
}
(taken from source code as is)
当您需要创建 ApplicationUserManager
时,它需要 IUserStore
并且用户存储的默认实现需要 DbContext
因此您可以提供自己的 DbContext实际上继承自 AuditDbContext
这应该可以解决问题,而不必双重继承。开源万岁!
关于c# - DbContext的第三方实现,如何同时实现IdentityDbContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42168013/
我正在尝试使用 Entity Framework、Autofac 和 Identity 2.0 将初始用户设置为管理员角色这是我的应用程序上下文类: public class ApplicationC
我需要向已有事件用户数据库的系统添加 ASP.NET Web API。 根据我使用内置于 asp.net 中的默认标识的经验,它通常使用代码优先方法从头开始创建表。这显然不是我正在寻找的方法。 我如何
有了我自己的 IdentityDbContext 实现,我希望它能够根据用户的选择连接到自定义数据库。所以我为默认数据库和用户选择的数据库创建了 2 个构造函数。 public class Appli
我有一个网络 API。我希望它有两种类型的用户。它们完全无关。 我如何管理它们的身份验证? 我不想将它们放在同一个表中并将它们的类型管理为角色,因为它们是不同的实体。一种用户供人类使用,另一种用户供服
非常类似于IdentityDbContext how to run migrations ,但似乎没有什么可以解决我的问题。我已经完成了研究,似乎没有太多关于使用 IdentityDbContext
我读到新的 EF7 允许内存存储,这使得单元测试更加容易。这在 DbContext 上效果很好,但我目前遇到的问题是我使用的是 IdentityDbContext,它没有随附该选项,或者我到目前为止还
找了将近2天没找到答案,特来这里问一下。 我刚开始使用 ASP.NET MVC 5。我已经设法扩展了默认的 ApplicationUser : IdentityUser 类,所以现在它存储了关于用户的
我一直在尝试将 sqlite 用于 IdentityDbContext 但没有成功,我在 macosx 中使用 .net 核心。我想知道这是否真的可能,或者是否有任何例子试图在没有运气的情况下搜索谷歌
我试图开发一个应用程序并创建我自己的数据库,然后首先使用数据库将其反射(reflect)到实体模型中。所以我现在已经有了让我们说 myOwnDBContext。 然后我认为将它与 IdentityDb
我有一个使用“Tracker Enabled DbContext”的现有 EF 项目。要使用这个包,我必须从它的“TrackerContext”派生: public class MyContext :
是否可以合并 DBContext 和 IdentityDbContext - 启用迁移,然后使用一个更新语句管理对我的数据库的代码优先更新? 即。在我的 IdentityModels.cs 文件中,我
我制作此方法是为了使单元测试 DbContext 更容易。此方法在内存中生成我的 db 的 Context。它之所以有效,是因为我使用实体对其进行了测试(如 _context.Projects、_co
我正在尝试在 ASP.NET Core 应用程序中使用 Entity Framework Core Identity 我已经创建了 Database Context 及其接口(interface),如
我开发了一个 MVC5 应用程序。数据库上下文派生自 IdentityDbContext。当我创建数据库上下文的实例并调用基类时,IdentityDbContext 正在调用 Database.Exi
我正试图摆脱代码优先迁移。 问题是 AspNetUsers 正在扩展 IdentityUser。结果,当我尝试使用 DbContext 时,出现以下错误。 EntityType 'IdentityUs
我有一个 IdentityDbContext,其中 ApplicationUser : IdentityUser 有一个双重 self 引用表来映射不同成员之间的 FriendShip: public
我的应用程序(内置于 MVC5/EF6 中)需要使用具有两个模式的单个数据库: identity:存储用户和角色的所有 AspNet 身份表。 application:存放我所有的通用应用表。 我想为
我正在尝试使用 IdentityDbContext 类设置自动迁移更新,并将更改传播到整个数据库的实际 DbContext。 在我进入代码之前,在我使用自动迁移实现 IdentityDbContext
我正在构建一个使用 token 进行授权的 web.api 服务。我遵循了 Dominick Baier 在他的博客中使用的指南 here . 今天我更新了 Owin、Entity Framework
我之前从“ASP.NET Core:安全性”LinkedIn 学习类(class) (https://1drv.ms/u/s!Ap1TSQ4qoVyxgrImtb6ZFwZXQGW2BA) 创建了一个
我是一名优秀的程序员,十分优秀!