我可以使用可选的外键自引用反向导航属性吗?

时间:2015-09-16 17:06:09

标签: entity-framework asp.net-identity-2

ASP.NET Identity开发人员应该识别我从IdentityUser派生的重命名的ApplicationUser类(现在称为User),该类具有基于Guid的Id属性。在我的User类中,我有一个可选的自引用外键(public Guid?ManagerId)和一个简单匹配的导航属性(公共用户管理器)。一切正常。我的问题是我想要第二个导航属性(DirectlyManagedUsers),我无法弄清楚如何对其进行注释,使其包含此用户的直接管理用户的集合。我很感激一些帮助。

这是我的用户类:

public class User : IdentityUser
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<User> manager, string authenticationType)
    {
        var userIdentity = await manager.CreateIdentityAsync(this, authenticationType);
        return userIdentity;
    }

    public User() : base()
    {
        DirectlyManagedUsers = new List<User>();
    }

    public User(string userName) : base(userName)
    {
        DirectlyManagedUsers = new List<User>();
    }

    [ForeignKey(nameof(Manager))]
    public Guid? ManagerId { get; set; }

    [ForeignKey(nameof(ManagerId))]
    public User Manager { get; set; }

    [InverseProperty(nameof(Manager))]
    public ICollection<User> DirectlyManagedUsers { get; set; }
}

我在模型生成时遇到以下错误:

One or more validation errors were detected during model generation:

User_DirectlyManagedUsers_Source_User_DirectlyManagedUsers_Target: : The types of all properties in the Dependent Role of a referential constraint must be the same as the corresponding property types in the Principal Role. The type of property 'ManagerId' on entity 'User' does not match the type of property 'Id' on entity 'User' in the referential constraint 'User_DirectlyManagedUsers'. The type of property 'ManagerId' on entity 'User' does not match the type of property 'Id' on entity 'User' in the referential constraint 'User_DirectlyManagedUsers'.

我知道这与ManagerId的可以为空的Guid类型有关。那我该怎么办?

1 个答案:

答案 0 :(得分:0)

好的,我弄清楚出了什么问题。我使用了一个可以为空的Guid(Guid?)作为我的ManagerId的类型。实际上在ASP.NET Identity框架中,预构建的Entity Framework IdentityUser类为其Id属性使用字符串类型。此字符串属性设置为使用.ToString()转换为字符串的新Guid的值。一旦我想出来(因为我知道字符串可以为空)我只是将ManagerId属性的类型更改为字符串,一切正常。因此,通过在Identity框架中找出正确的类型来解决我的问题,而不是通过以不同的方式为Entity Framework注释属性。如果Id不是可以为空的类型,我很好奇是否有人可以回答原始问题。