我使用的是开箱即用的ApplicationUser
,但还有一些其他属性:
public class ApplicationUser : IdentityUser, IPayCaddyEntity
{
...
// TODO Figure out how to config.
public string FullName { get; set; }
public string CellNumber { get; set; }
}
然后对于'mapping',我为几乎所有实体使用EntityConfig
类的以下基类:
abstract class EntityConfigBase<TEntity>: EntityTypeConfiguration<TEntity> where TEntity: class, IPayCaddyEntity
{
protected EntityConfigBase()
{
HasKey(e => e.Id);
}
}
其中IPayCaddyEntity
仅确保所有实体的Id
属性:
public interface IPayCaddyEntity
{
string Id { get; set; }
}
现在,更接近手头的问题,ApplicationUser
的配置:
class ApplicationUserConfig: EntityConfigBase<ApplicationUser>
{
public ApplicationUserConfig()
{
Property(e => e.FullName).IsRequired().HasMaxLength(MaxNameLength);
Property(e => e.CellNumber).IsRequired().HasMaxLength(20);
}
}
我也在使用开箱即用的IdentityDbContext
和其他应用表:
public class PayCaddyDbContext : IdentityDbContext<ApplicationUser>
{
...
public DbSet<AccountPayment> AccountPayments { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//modelBuilder.Configurations.Add(new ApplicationUserConfig());
modelBuilder.Configurations.Add(new AccountPaymentConfig());
base.OnModelCreating(modelBuilder);
}
}
当添加ApplicationUserConfig
被注释掉时,一切正常,但是当它运行时,当我尝试登录应用程序时,即当它尝试访问users表时,我收到以下错误:< / p>
关键组件“Id”不是类型的声明属性 'ApplicationUser'
在我自己的代码之前调用base.OnModelCreating(modelBuilder)
没有明显区别。
现在它是IdentityUser<TKey, TLogin, TRole, TClaim>
上的声明属性,ApplicationUser
最终从中获取。通常继承不是问题,因为我的所有其他实体也从公共基类获得它们的Id
属性:
public abstract class BaseEntity : IBaseEntity
{
public string Id { get; set; }
}
public class AccountPayment : BaseEntity
{
...
}
我没有任何其他实体的错误(为简洁起见,我在这里删除了很多),我可以做出的最接近的猜测是ApplicationUser
仅来自接口IBaseEntity
,而不是来自BaseEntity
,通常提供Id
属性。
这是问题的原因,或者是什么,除了在ApplicationUser
中直接配置我自己的OnModelCreating
属性外,我可以做任何事情来解决它吗?
答案 0 :(得分:0)
您还必须覆盖ApplicationUser
实体
public override string Id { get; set; }
我认为这是因为实体框架的工作方式无法到达位于基座public virtual TKey Id { get; set; }
的{{1}}
答案 1 :(得分:0)
您如何实施IPayCaddyEntity
界面?我一步一步地重现了你的问题,我没有得到任何错误。第一种方法应该可以正常工作。
public class ApplicationUser : IdentityUser, IPayCaddyEntity
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
public string FullName { get; set; }
public string CellNumber { get; set; }
//from the IPayCaddyEntity
public string Id { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new ApplicationUserConfig());
base.OnModelCreating(modelBuilder);
}