应用程序用户ID的外键在更新数据库时抛出键错误

时间:2015-01-29 02:52:22

标签: entity-framework ef-code-first asp.net-identity asp.net-identity-2 ef-fluent-api

我首先使用代码在YogaSpace上创建一个外键,该外键将ApplicationUsers ID与ApplicationUserRefId类中的YogaSpace相关联。因此,每次我创建并插入新的YogaSpace时,它都会使用登录的人的ID填充ApplicationUser id。我希望它是{{1}的一对多。对于一个YogaSpace id,对象可以是多个。但是我遇到了关键错误。

ApplicationUser

这是我的public class YogaSpace { // for a one-to-one relationship // great tutorial on code-first //http://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx [Index (IsUnique = true)] [Key] [Column(Order = 1)] public int YogaSpaceId { get; set; } [Key] [Column(Order = 2)] public int ApplicationUserRefId { get; set; } [ForeignKey("ApplicationUserRefId")] public virtual ApplicationUser ApplicationUser { get; set; } [Required] public string Name { get; set; } } 班级

ApplicationUser

以下是所有错误。更新数据库时,它与键有关。

  

在模型生成期间检测到一个或多个验证错误:

     

GiftExchange.DataLayer.Models.IdentityUserLogin :: EntityType'IdentityUserLogin'>没有定义键。定义此EntityType的键。   GiftExchange.DataLayer.Models.IdentityUserRole :: EntityType'IdentityUserRole'>没有定义键。定义此EntityType的密钥。

UPDATE! 我试图重写那个要求我创建一个密钥的类,但它仍然不起作用

public class ApplicationUser : IdentityUser
{   
    //other members left out to save space
    public virtual ICollection<YogaSpace> YogaSpaces { get; set; }

    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;
    }
}

我尝试使用此链接中的流畅api添加密钥 [User in Entity type MVC5 EF6

在我的public class TestIdentityUserLogin : IdentityUserLogin { [Key] public override string UserId { get; set; } } 中包含

YogaSpaceContext

它似乎从包管理器中删除了无键定义的错误,用于更新数据库。 但是我如何首先在代码中实现它呢?

2 个答案:

答案 0 :(得分:0)

我会执行以下操作:在ApplicationUser课程中,添加ForeignKey属性,

public ApplicationUser : IdentityUser {
    [ForeignKey("UserID")]
    public virtual ICollection<YogaSpace> YogaSpaces { get; set; } 

    // other properties
}

并在YogaSpace模型中,您要跟踪它所属的ApplicationUser

public class YogaSpace{
    public string UserId { get; set; }

    // other properties
}

您不需要将整个ApplicationUser实例存储在YogaSpace课程中,UserID将自动生成。重要的是string类型,ID的{​​{1}}!

(重复我对Foreign Key To Microsoft.AspNet.Identity.EntityFramework.IdentityUser?的回答)

答案 1 :(得分:-2)

实际上,如果您使用代码优先,我认为您应该尝试不同的东西,例如..

您的ApplicationUser类:

class ApplicationUser
{
     public int Id { get; set; }
     public ICollection<YogaSpace> YogaSpaces { get; set; }
}

你有一系列YogaSpaces,然后,你的YogaSpace课程如下:

public class YogaSpace
{
   public int Id { get; set; };
   public int AnotherProperty { get; set; }
}

EF将为您创建合适的桌子。

PS:未经测试,但就是这样。