0

我首先使用代码创建一个外键YogaSpace,将ApplicationUsersid 链接到ApplicationUserRefId类中YogaSpace。因此,每次我创建并插入一个新YogaSpace的时,它都会用登录人的 id 填充ApplicationUserid。我希望它是一对多的,其中一个id的YogaSpace对象可以是多个。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

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

以下是所有错误。更新数据库时,它会抛出与键相关的问题。

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

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

更新!我尝试覆盖它要求我为其创建密钥的类,但它仍然不起作用

public class TestIdentityUserLogin : IdentityUserLogin
{
    [Key]
    public override string UserId { get; set; }
}

我尝试使用在此链接中找到的流利的 api 添加密钥 [实体类型 MVC5 EF6 中的用户

在我的YogaSpaceContext我包括

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);
        modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });
    }

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

4

2 回答 2

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会自动生成。重要的是 is 是 type string, the IDof the 也是如此ApplicationUser

(复制了我对 Microsoft.AspNet.Identity.EntityFramework.IdentityUser的外键的回答? )

于 2015-03-12T12:52:21.847 回答
-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:未测试,但就是这样。

于 2015-01-29T03:04:23.833 回答