- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因此,我正在现有数据库之上构建一个应用程序,我对其更改的权限有限(想法是尽可能少地更改数据库架构)。这是一个 MVC 5 应用程序,试图将身份系统与自定义用户存储一起使用到 MySQL 数据库。
问题:尝试在注册方法中通过自动生成的 AccountController 注册用户时出现以下异常:
IdentityResult result = await UserManager.CreateAsync(user, model.Password);
System.InvalidOperationException: The entity type ApplicationUser is not part of the model for the current context. at System.Data.Entity.Internal.InternalContext.UpdateEntitySetMappingsForType(Type entityType) at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) at System.Data.Entity.Internal.Linq.InternalSet
1.Initialize()
1.get_InternalContext() at System.Data.Entity.Infrastructure.DbQuery
at System.Data.Entity.Internal.Linq.InternalSet1.System.Linq.IQueryable.get_Provider()
1 source, Expression
at System.Data.Entity.QueryableExtensions.FirstOrDefaultAsync[TSource](IQueryable1 predicate, CancellationToken cancellationToken)
1 source, Expression
at System.Data.Entity.QueryableExtensions.FirstOrDefaultAsync[TSource](IQueryable1 predicate)
6.d__6c.MoveNext()
at Microsoft.AspNet.Identity.EntityFramework.UserStore
我尝试过的:
HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
到 new ApplicationUserManager(new UserStoreService(new Entities()));
这解决了眼前的问题,让我注册。但是,这会在稍后尝试重置密码时导致问题,并且我遇到另一个我无法解决的问题,因为我获得了无效的用户 token (尽管我可以确认用户 token 在我使用时可以正常工作HttpContext.GetOwinContext... 用户管理器的版本 <add name="Entities" connectionString="metadata=res://*/Models.tools.csdl|res://*/Models.tools.ssdl|res://*/Models.tools.msl;provider=MySql.Data.MySqlClient;provider connection string="server=localhost;user id=user;password=***;persistsecurityinfo=True;database=db"" providerName="System.Data.EntityClient" />
像这样的普通连接字符串: <add name="Entities" connectionString="server=localhost;user id=user;password=***;persistsecurityinfo=True;database=db" providerName="MySql.Data.MySqlClient" />
.由于无意的代码优先异常,这很快就会爆炸。然后在路上出现了一些其他问题,这些问题似乎呈螺旋形上升(在解决了 table 上没有声明的 key 等问题之后)。我愿意接受这方面的建议,但宁愿不必走这条路。
下面是与设置相关的代码。任何想法我还可以在这里遗漏什么?或者是用连接字符串的想法解决这个问题的唯一方法?
谢谢!
设置我首先对现有的 MySQL 数据库使用数据库 (EDMX)。跟随 this to change the primary key for users to an int ,我有一个自定义用户存储服务附加到我的数据库和用户表。
DbContext 设置(我修改了自动生成的文件以尝试使用身份系统):
public partial class Entities : IdentityDbContext<ApplicationUser, CustomRole, int, CustomUserLogin, CustomUserRole, CustomUserClaim>// DbContext
{
public Entities()
: base("name=Entities")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public static Entities Create()
{
return new Entities();
}
//DbSets are here
}
应用程序用户.cs:
public class ApplicationUser : IdentityUser<int, CustomUserLogin, CustomUserRole, CustomUserClaim> // IUser<int>//IdentityUser
{
//custom properties are here
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser, int> manager)
{
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
}
应用程序用户管理器.cs
public class ApplicationUserManager : UserManager<ApplicationUser, int>
{
public ApplicationUserManager(IUserStore<ApplicationUser, int> store)
: base(store)
{ }
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
var manager = new ApplicationUserManager(new UserStoreService(context.Get<Entities>()));
// Configure validation logic for usernames
manager.UserValidator = new UserValidator<ApplicationUser, int>(manager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};
// Configure validation logic for passwords
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = true,
RequireDigit = true,
RequireLowercase = true,
RequireUppercase = true,
};
manager.UserLockoutEnabledByDefault = true;
manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5);
manager.MaxFailedAccessAttemptsBeforeLockout = 5;
manager.EmailService = new EmailService();
var dataProtectionProvider = options.DataProtectionProvider;
if (dataProtectionProvider != null)
{
manager.UserTokenProvider =
new DataProtectorTokenProvider<ApplicationUser, int>(dataProtectionProvider.Create("ASP.NET Identity")) { TokenLifespan = TimeSpan.FromHours(24) };
}
return manager;
}
}
UserStoreService.cs
public class UserStoreService : UserStore<ApplicationUser, CustomRole, int, CustomUserLogin, CustomUserRole, CustomUserClaim> //, IUserStore<ApplicationUser, int>, IUserPasswordStore<ApplicationUser, int>, IUserEmailStore<ApplicationUser, int>, IUserLockoutStore<ApplicationUser, int>, IUserSecurityStampStore<ApplicationUser, int>
{
private Entities _db; // = new Entities();
public UserStoreService(Entities db) : base(db)
{
_db = db;
}
public override Task CreateAsync(ApplicationUser user)
{
var profile = new ffs_profile {
//set props here
};
_db.ffs_profile.Add(profile);
return _db.SaveChangesAsync();
}
public async override Task<ApplicationUser> FindByNameAsync(string userName)
{
var profile = await _db.ffs_profile.Where(u => u.email == userName).FirstOrDefaultAsync();
ApplicationUser user = null;
if (profile != null)
user = ToApplicationUser(profile);
return user;
}
private ApplicationUser ToApplicationUser(ffs_profile profile)
{
return new ApplicationUser
{
//set properties here
};
}
public override Task<string> GetPasswordHashAsync(ApplicationUser user)
{
if (user == null)
{
throw new ArgumentException("null user");
}
return Task.FromResult(user.PasswordHash);
}
public override Task<bool> HasPasswordAsync(ApplicationUser user)
{
return Task.FromResult(user.PasswordHash != null);
}
public override Task SetPasswordHashAsync(ApplicationUser user, string passwordHash)
{
return Task.Run(() =>
{
if (passwordHash == null)
throw new ArgumentNullException("passwordHash");
if (string.IsNullOrWhiteSpace(passwordHash))
throw new ArgumentException("passwordHash cannot be null, empty, or consist of whitespace.");
user.PasswordHash = passwordHash;
});
}
public override async Task<ApplicationUser> FindByIdAsync(int userId)
{
var profile = await _db.ffs_profile.Where(u => u.profile_id == userId).FirstOrDefaultAsync();
ApplicationUser user = null;
if (profile != null)
user = ToApplicationUser(profile);
return user;
}
public override Task<string> GetSecurityStampAsync(ApplicationUser user)
{
if (user == null)
{
throw new ArgumentNullException("user");
}
return Task.FromResult<string>(user.SecurityStamp);
}
public override Task SetSecurityStampAsync(ApplicationUser user, string stamp)
{
if (user == null)
{
throw new ArgumentNullException("user");
}
user.SecurityStamp = stamp;
return Task.FromResult<int>(0);
}
}
最后,帐户 Controller 的相关部分:
public class AccountController : Controller
{
private ApplicationSignInManager _signInManager;
private ApplicationUserManager _userManager;
public AccountController()
{
}
public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager )
{
UserManager = userManager;
SignInManager = signInManager;
}
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
}
}
// other autogenerated methods
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser
{
//set props here
};
try
{
IdentityResult result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
return RedirectToAction("Index", "Home");
}
AddErrors(result);
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.ToString());
}
}
return View(model);
}
}
最佳答案
令我懊恼的是,我不得不选择上面的选项 2。我将我的连接字符串更改为类似于常规连接字符串(见上文),然后不得不重写一些我之前没有处理过的 UserManager 方法(例如 manager.GetRolesAsync()
和 manager.CreateIdentityAsync
)。我现在可以注册、重设密码等。
关于c# - 实体类型 ApplicationUser 不是当前上下文模型的一部分,具有自定义用户存储的 DB First,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42028014/
我当前正在存储给定产品的上传图像,如下所示: class Product(db.Model): images= db.ListProperty(db.Blob) # More prop
每次对架构或新迁移文件进行更改时,我都会运行以下命令: rake db:drop db:create db:migrate db:seed 是否有预先构建的等效方法来执行此操作? 我从我读到的内容中想
在 android 中使用房间作为数据库。当我试图在 sqlviewer 中查看数据时,在数据库文件中找不到表Myapp.db 文件为空。数据/data/packageName/databases/M
我搜索并尝试了很多次,但没有找到我的答案。我有一些用小 cucumber (在 Rails 项目中)编写的项目的功能文件。所有步骤都已定义,如果我单独启动它们,功能本身运行得很好。我可以将所有场景与我
您必须承认,对于 Rails 和数据库的新手来说,rubyonrails.org 上的官方解释使所有这四个任务听起来完全一样。引用: rake db:test:clone Recreate the
当我尝试运行时: heroku run rake db:drop db:create db:migrate 我得到错误: Running rake db:drop attached to termin
rake db:migrate 和 rake db:reset 之间的区别对我来说非常清楚。我不明白的是 rake db:schema:load 与前两者有何不同。 只是为了确保我在同一页面上: ra
我们都知道,我们可以使用 Azure 函数(使用 out 参数或使用 return)在 cosmos DB 中一次保存一个文档,例如: object outputDocument = new { i
我有一个包含 60 多个表的 mysql 数据库。这是在我将 joomla 版本 2.5.3 从本地灯移植到网络服务器时构建的。 我运行 mysql-db: 移植后我发现我无法登录 amdin 区域。
我想轻松地将现有数据库迁移到 Azure 托管。在我的项目中,我使用 Entity Framework DB First。有什么经验教训或例子可以说明如何做到这一点吗? 最佳答案 您本地使用什么数据库
所以,我一直在使用 MagicalRecord 开发 iPad 应用程序,最近在转移到自动迁移商店后我遇到了一些问题。我需要将我的 .db 文件从一个设备同步到另一个设备,所以我需要所有数据都在 .d
自从我在 Heroku 上部署并希望与生产相匹配后,我最近切换到 postgres 来开发一个 Rails 应用程序。当我将数据库名称设置为“postgres”时,我的应用程序安装了 Postgres
我使用 oledb 提供程序(SQLOLEDB 和 SQL Native OLEDB 提供程序)创建了一个示例应用程序。 案例 1:提供者 = SQLOLEDB hr = ::CoInitialize
我正在为 NodeJs 使用 mongodb 驱动程序,其中有 3 个方法: 1) db.collection.insert 2) 数据库.collection.insertOne 3) db.col
我是 datomic 的新手,我仍在努力弄清楚系统是如何构建的。特别是,我不明白 :db.part/db 扮演什么角色,因为每次安装架构时似乎都需要它。有人可以解释一下这一切意味着什么吗? (需要 '
Berkeley DB 是否有空间索引,例如 R-tree? 最佳答案 有人问the same question on the Oracle forum .还没有甲骨文回答。但答案是否定的,它没有任何
请解释一下这是什么意思 $db = new DB(DB_DRIVER, DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE); 它给了我一个错误 "E
berkeley-db-je 的最新版本是什么? 来自 oracle , 为 7.5。 但来自maven存储库,它是 18.3.12。 有没有人知道更多的细节? 最佳答案 Berkeley DB Ja
我不明白查询构建器的替换和更新之间的区别。尤其是替换文档... This method executes a REPLACE statement, which is basically the SQL
看起来 BerkeleyDB 被 Oracle 收购了,它没有在其网站上发布源代码? 最佳答案 Sleepycat 于 2006 年被 Oracle 收购。该产品继续在原始开源许可下可用,并继续得到增
我是一名优秀的程序员,十分优秀!