Entity Framework Core foreign key problem with IdentityUser
I am trying to create a new entry in my database with EF Core like this:
RefreshToken newDBRefreshToken = new RefreshToken()
Id = 0,
Token = refreshToken,
AccessToken = accessToken,
UserId = userId
;
_dbContext.RefreshToken.Add(newDBRefreshToken);
I get this error message upon saving:
The foreign key 'UserId: 5b82dbb0-c38b-4144-b51d-e092ef6f5e55' set
on 'RefreshToken' with the key value 'Id: -2147482647' matches an
entity of type 'IdentityUser', however the principal entity type
should be assignable to 'ApplicationUser'.
I have two Entities:
//To make it possible to use AspNetUsers as a reference table
public class ApplicationUser : IdentityUser
public class RefreshToken : BaseEntity //Has int Id and CreateDate ect...
//Reference the IdentityUser
public string UserId get; set;
public ApplicationUser User get; set;
public string Token get; set;
public string AccessToken get; set;
public DateTime ValidUntil get; set;
the migration created my RefreshToken table like this:
Edit:
This is my Startup.cs section:
services.AddDbContext<ApiContext>(options =>
options.UseSqlServer(connection, builder => builder.MigrationsAssembly(typeof(Startup).Assembly.FullName)
).EnableSensitiveDataLogging(true));
// ===== Add Identity ========
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApiContext>()
.AddErrorDescriber<IdentityErrorDescriberDE>()
.AddDefaultTokenProviders();
I tried using ApplicationUser
as TUser, which gives me this error:
InvalidOperationException: Unable to resolve service for type
'Microsoft.AspNetCore.Identity.UserManager`1[Microsoft.AspNetCore.Identity.IdentityUser]'
while attempting to activate 'Web.Controllers.AccountController'.
This is my Context:
public class ApiContext : IdentityDbContext
...
c# asp.net-core asp.net-identity entity-framework-core
|
show 1 more comment
I am trying to create a new entry in my database with EF Core like this:
RefreshToken newDBRefreshToken = new RefreshToken()
Id = 0,
Token = refreshToken,
AccessToken = accessToken,
UserId = userId
;
_dbContext.RefreshToken.Add(newDBRefreshToken);
I get this error message upon saving:
The foreign key 'UserId: 5b82dbb0-c38b-4144-b51d-e092ef6f5e55' set
on 'RefreshToken' with the key value 'Id: -2147482647' matches an
entity of type 'IdentityUser', however the principal entity type
should be assignable to 'ApplicationUser'.
I have two Entities:
//To make it possible to use AspNetUsers as a reference table
public class ApplicationUser : IdentityUser
public class RefreshToken : BaseEntity //Has int Id and CreateDate ect...
//Reference the IdentityUser
public string UserId get; set;
public ApplicationUser User get; set;
public string Token get; set;
public string AccessToken get; set;
public DateTime ValidUntil get; set;
the migration created my RefreshToken table like this:
Edit:
This is my Startup.cs section:
services.AddDbContext<ApiContext>(options =>
options.UseSqlServer(connection, builder => builder.MigrationsAssembly(typeof(Startup).Assembly.FullName)
).EnableSensitiveDataLogging(true));
// ===== Add Identity ========
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApiContext>()
.AddErrorDescriber<IdentityErrorDescriberDE>()
.AddDefaultTokenProviders();
I tried using ApplicationUser
as TUser, which gives me this error:
InvalidOperationException: Unable to resolve service for type
'Microsoft.AspNetCore.Identity.UserManager`1[Microsoft.AspNetCore.Identity.IdentityUser]'
while attempting to activate 'Web.Controllers.AccountController'.
This is my Context:
public class ApiContext : IdentityDbContext
...
c# asp.net-core asp.net-identity entity-framework-core
2
It's impossible to say without being able to see your context and/or startup, but in one of the two you've referencedIdentityUser
as theTUser
type param to something that takes that.IdentityDbContext
has versions that take generic type params to specify implementations of domain types. You need to make sure it's using your entity, i.e.IdentityDbContext<ApplicationUser>
notIdentityDbDontext<IdentityUser>
. Also, in startup, you should have something likeAddDefaultIdentity<ApplicationUser>()
, notAddDefaultIdentity<IdentityUser>()
.
– Chris Pratt
Nov 13 '18 at 14:22
Hi, I edited my post. Didn't work. AddDefaultIdentity is not available. What am I missing? :/
– DoubleVoid
Nov 13 '18 at 14:32
1
You need to change your_Login
partial, which injectsUserManager<IdentityUser>
andSignInManager<IdentityUser>
by default. Change both of those instances toApplicationUser
as well.
– Chris Pratt
Nov 13 '18 at 14:46
Hey thanks. Yeah you're right! It's working now :)
– DoubleVoid
Nov 13 '18 at 14:58
2
Just FYI: what was actually happening was because you hadIdentityUser
as theTUser
type param, it was making that the base user entity, and then sinceApplicationUser
inherited from that, it was setting up a single table inheritance structure with a discriminator column. You were creating users asIdentityUser
instances and then attempting associate them asApplicationUser
instances, which they were not. The changes you made causedApplicationUser
to be the user, so the association works fine then.
– Chris Pratt
Nov 13 '18 at 16:05
|
show 1 more comment
I am trying to create a new entry in my database with EF Core like this:
RefreshToken newDBRefreshToken = new RefreshToken()
Id = 0,
Token = refreshToken,
AccessToken = accessToken,
UserId = userId
;
_dbContext.RefreshToken.Add(newDBRefreshToken);
I get this error message upon saving:
The foreign key 'UserId: 5b82dbb0-c38b-4144-b51d-e092ef6f5e55' set
on 'RefreshToken' with the key value 'Id: -2147482647' matches an
entity of type 'IdentityUser', however the principal entity type
should be assignable to 'ApplicationUser'.
I have two Entities:
//To make it possible to use AspNetUsers as a reference table
public class ApplicationUser : IdentityUser
public class RefreshToken : BaseEntity //Has int Id and CreateDate ect...
//Reference the IdentityUser
public string UserId get; set;
public ApplicationUser User get; set;
public string Token get; set;
public string AccessToken get; set;
public DateTime ValidUntil get; set;
the migration created my RefreshToken table like this:
Edit:
This is my Startup.cs section:
services.AddDbContext<ApiContext>(options =>
options.UseSqlServer(connection, builder => builder.MigrationsAssembly(typeof(Startup).Assembly.FullName)
).EnableSensitiveDataLogging(true));
// ===== Add Identity ========
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApiContext>()
.AddErrorDescriber<IdentityErrorDescriberDE>()
.AddDefaultTokenProviders();
I tried using ApplicationUser
as TUser, which gives me this error:
InvalidOperationException: Unable to resolve service for type
'Microsoft.AspNetCore.Identity.UserManager`1[Microsoft.AspNetCore.Identity.IdentityUser]'
while attempting to activate 'Web.Controllers.AccountController'.
This is my Context:
public class ApiContext : IdentityDbContext
...
c# asp.net-core asp.net-identity entity-framework-core
I am trying to create a new entry in my database with EF Core like this:
RefreshToken newDBRefreshToken = new RefreshToken()
Id = 0,
Token = refreshToken,
AccessToken = accessToken,
UserId = userId
;
_dbContext.RefreshToken.Add(newDBRefreshToken);
I get this error message upon saving:
The foreign key 'UserId: 5b82dbb0-c38b-4144-b51d-e092ef6f5e55' set
on 'RefreshToken' with the key value 'Id: -2147482647' matches an
entity of type 'IdentityUser', however the principal entity type
should be assignable to 'ApplicationUser'.
I have two Entities:
//To make it possible to use AspNetUsers as a reference table
public class ApplicationUser : IdentityUser
public class RefreshToken : BaseEntity //Has int Id and CreateDate ect...
//Reference the IdentityUser
public string UserId get; set;
public ApplicationUser User get; set;
public string Token get; set;
public string AccessToken get; set;
public DateTime ValidUntil get; set;
the migration created my RefreshToken table like this:
Edit:
This is my Startup.cs section:
services.AddDbContext<ApiContext>(options =>
options.UseSqlServer(connection, builder => builder.MigrationsAssembly(typeof(Startup).Assembly.FullName)
).EnableSensitiveDataLogging(true));
// ===== Add Identity ========
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApiContext>()
.AddErrorDescriber<IdentityErrorDescriberDE>()
.AddDefaultTokenProviders();
I tried using ApplicationUser
as TUser, which gives me this error:
InvalidOperationException: Unable to resolve service for type
'Microsoft.AspNetCore.Identity.UserManager`1[Microsoft.AspNetCore.Identity.IdentityUser]'
while attempting to activate 'Web.Controllers.AccountController'.
This is my Context:
public class ApiContext : IdentityDbContext
...
c# asp.net-core asp.net-identity entity-framework-core
c# asp.net-core asp.net-identity entity-framework-core
edited Nov 13 '18 at 14:32
DoubleVoid
asked Nov 13 '18 at 14:12
DoubleVoidDoubleVoid
368629
368629
2
It's impossible to say without being able to see your context and/or startup, but in one of the two you've referencedIdentityUser
as theTUser
type param to something that takes that.IdentityDbContext
has versions that take generic type params to specify implementations of domain types. You need to make sure it's using your entity, i.e.IdentityDbContext<ApplicationUser>
notIdentityDbDontext<IdentityUser>
. Also, in startup, you should have something likeAddDefaultIdentity<ApplicationUser>()
, notAddDefaultIdentity<IdentityUser>()
.
– Chris Pratt
Nov 13 '18 at 14:22
Hi, I edited my post. Didn't work. AddDefaultIdentity is not available. What am I missing? :/
– DoubleVoid
Nov 13 '18 at 14:32
1
You need to change your_Login
partial, which injectsUserManager<IdentityUser>
andSignInManager<IdentityUser>
by default. Change both of those instances toApplicationUser
as well.
– Chris Pratt
Nov 13 '18 at 14:46
Hey thanks. Yeah you're right! It's working now :)
– DoubleVoid
Nov 13 '18 at 14:58
2
Just FYI: what was actually happening was because you hadIdentityUser
as theTUser
type param, it was making that the base user entity, and then sinceApplicationUser
inherited from that, it was setting up a single table inheritance structure with a discriminator column. You were creating users asIdentityUser
instances and then attempting associate them asApplicationUser
instances, which they were not. The changes you made causedApplicationUser
to be the user, so the association works fine then.
– Chris Pratt
Nov 13 '18 at 16:05
|
show 1 more comment
2
It's impossible to say without being able to see your context and/or startup, but in one of the two you've referencedIdentityUser
as theTUser
type param to something that takes that.IdentityDbContext
has versions that take generic type params to specify implementations of domain types. You need to make sure it's using your entity, i.e.IdentityDbContext<ApplicationUser>
notIdentityDbDontext<IdentityUser>
. Also, in startup, you should have something likeAddDefaultIdentity<ApplicationUser>()
, notAddDefaultIdentity<IdentityUser>()
.
– Chris Pratt
Nov 13 '18 at 14:22
Hi, I edited my post. Didn't work. AddDefaultIdentity is not available. What am I missing? :/
– DoubleVoid
Nov 13 '18 at 14:32
1
You need to change your_Login
partial, which injectsUserManager<IdentityUser>
andSignInManager<IdentityUser>
by default. Change both of those instances toApplicationUser
as well.
– Chris Pratt
Nov 13 '18 at 14:46
Hey thanks. Yeah you're right! It's working now :)
– DoubleVoid
Nov 13 '18 at 14:58
2
Just FYI: what was actually happening was because you hadIdentityUser
as theTUser
type param, it was making that the base user entity, and then sinceApplicationUser
inherited from that, it was setting up a single table inheritance structure with a discriminator column. You were creating users asIdentityUser
instances and then attempting associate them asApplicationUser
instances, which they were not. The changes you made causedApplicationUser
to be the user, so the association works fine then.
– Chris Pratt
Nov 13 '18 at 16:05
2
2
It's impossible to say without being able to see your context and/or startup, but in one of the two you've referenced
IdentityUser
as the TUser
type param to something that takes that. IdentityDbContext
has versions that take generic type params to specify implementations of domain types. You need to make sure it's using your entity, i.e. IdentityDbContext<ApplicationUser>
not IdentityDbDontext<IdentityUser>
. Also, in startup, you should have something like AddDefaultIdentity<ApplicationUser>()
, not AddDefaultIdentity<IdentityUser>()
.– Chris Pratt
Nov 13 '18 at 14:22
It's impossible to say without being able to see your context and/or startup, but in one of the two you've referenced
IdentityUser
as the TUser
type param to something that takes that. IdentityDbContext
has versions that take generic type params to specify implementations of domain types. You need to make sure it's using your entity, i.e. IdentityDbContext<ApplicationUser>
not IdentityDbDontext<IdentityUser>
. Also, in startup, you should have something like AddDefaultIdentity<ApplicationUser>()
, not AddDefaultIdentity<IdentityUser>()
.– Chris Pratt
Nov 13 '18 at 14:22
Hi, I edited my post. Didn't work. AddDefaultIdentity is not available. What am I missing? :/
– DoubleVoid
Nov 13 '18 at 14:32
Hi, I edited my post. Didn't work. AddDefaultIdentity is not available. What am I missing? :/
– DoubleVoid
Nov 13 '18 at 14:32
1
1
You need to change your
_Login
partial, which injects UserManager<IdentityUser>
and SignInManager<IdentityUser>
by default. Change both of those instances to ApplicationUser
as well.– Chris Pratt
Nov 13 '18 at 14:46
You need to change your
_Login
partial, which injects UserManager<IdentityUser>
and SignInManager<IdentityUser>
by default. Change both of those instances to ApplicationUser
as well.– Chris Pratt
Nov 13 '18 at 14:46
Hey thanks. Yeah you're right! It's working now :)
– DoubleVoid
Nov 13 '18 at 14:58
Hey thanks. Yeah you're right! It's working now :)
– DoubleVoid
Nov 13 '18 at 14:58
2
2
Just FYI: what was actually happening was because you had
IdentityUser
as the TUser
type param, it was making that the base user entity, and then since ApplicationUser
inherited from that, it was setting up a single table inheritance structure with a discriminator column. You were creating users as IdentityUser
instances and then attempting associate them as ApplicationUser
instances, which they were not. The changes you made caused ApplicationUser
to be the user, so the association works fine then.– Chris Pratt
Nov 13 '18 at 16:05
Just FYI: what was actually happening was because you had
IdentityUser
as the TUser
type param, it was making that the base user entity, and then since ApplicationUser
inherited from that, it was setting up a single table inheritance structure with a discriminator column. You were creating users as IdentityUser
instances and then attempting associate them as ApplicationUser
instances, which they were not. The changes you made caused ApplicationUser
to be the user, so the association works fine then.– Chris Pratt
Nov 13 '18 at 16:05
|
show 1 more comment
0
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53282932%2fentity-framework-core-foreign-key-problem-with-identityuser%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53282932%2fentity-framework-core-foreign-key-problem-with-identityuser%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
2
It's impossible to say without being able to see your context and/or startup, but in one of the two you've referenced
IdentityUser
as theTUser
type param to something that takes that.IdentityDbContext
has versions that take generic type params to specify implementations of domain types. You need to make sure it's using your entity, i.e.IdentityDbContext<ApplicationUser>
notIdentityDbDontext<IdentityUser>
. Also, in startup, you should have something likeAddDefaultIdentity<ApplicationUser>()
, notAddDefaultIdentity<IdentityUser>()
.– Chris Pratt
Nov 13 '18 at 14:22
Hi, I edited my post. Didn't work. AddDefaultIdentity is not available. What am I missing? :/
– DoubleVoid
Nov 13 '18 at 14:32
1
You need to change your
_Login
partial, which injectsUserManager<IdentityUser>
andSignInManager<IdentityUser>
by default. Change both of those instances toApplicationUser
as well.– Chris Pratt
Nov 13 '18 at 14:46
Hey thanks. Yeah you're right! It's working now :)
– DoubleVoid
Nov 13 '18 at 14:58
2
Just FYI: what was actually happening was because you had
IdentityUser
as theTUser
type param, it was making that the base user entity, and then sinceApplicationUser
inherited from that, it was setting up a single table inheritance structure with a discriminator column. You were creating users asIdentityUser
instances and then attempting associate them asApplicationUser
instances, which they were not. The changes you made causedApplicationUser
to be the user, so the association works fine then.– Chris Pratt
Nov 13 '18 at 16:05