我首先使用代码在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
它似乎从包管理器中删除了无键定义的错误,用于更新数据库。 但是我如何首先在代码中实现它呢?
答案 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:未经测试,但就是这样。