关键组件“Id”不是

时间:2015-10-24 13:33:56

标签: c# entity-framework ef-code-first entity-framework-6

我使用的是开箱即​​用的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属性外,我可以做任何事情来解决它吗?

2 个答案:

答案 0 :(得分:0)

您还必须覆盖ApplicationUser实体

中的ID
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);
}