实体框架中的1:1关系
本文关键字:关系 框架 实体 | 更新日期: 2023-09-27 18:06:51
我需要ApplicationUser
与实体框架中我自己的类之间的1:1关系。
我这样做:
public class ApplicationUser : IdentityUser
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
return userIdentity;
}
/*Realations*/
public virtual ICollection<Comment> Comments { get; set; }
public virtual Posts Post { get; set; }
}
public class Posts : System.Object
{
public Posts()
{
this.PostDate = DateTime.Now;
this.PostViews = 0;
this.PostPic = "d.jpg";
}
[Key]
public int PostID { get; set; }
public string PostName { get; set; }
public string PostSummery { get; set; }
public string PostDesc { get; set; }
public string PostPic { get; set; }
public DateTime PostDate { get; set; }
public int PostViews { get; set; }
public string postMetaKeys { get; set; }
public string PostMetaDesc { get; set; }
public string UserId { get; set; }
[Key, ForeignKey("UserId")]
public virtual ApplicationUser ApplicationUser { get; set; }
public int CategoryID { get; set; }
[Key, ForeignKey("CategoryID")]
public virtual Categories Category { get; set; }
public virtual ICollection<Comment> commnets {get; set;}
}
但是当我在Nuget
控制台写命令"添加迁移关系"时,我得到了一个异常。
无法确定对象之间关联的主要端"FinalKaminet.Models类型。ApplicationUser'和'Models.Posts'。的此关联的主体端必须使用关系流畅API或数据注释。
我还在IdentityModels
中添加了下面的代码,但显示了另一个错误:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<ApplicationUser>()
.HasOptional(f => f.Post)
.WithRequired(s => s.ApplicationUser);
}
在模型生成过程中检测到一个或多个验证错误:
ApplicationUser_Post_Target::多重性在Role中无效关系'ApplicationUser_Post'中的'ApplicationUser_Post_Target'。因为依赖角色属性不是关键属性,所以从属角色的多重性的上界必须是"*"。
怎么了?
你想在用户和帖子之间建立1对1的关系吗?一个用户只能发一个,且只能发一个?
无论如何,在EF(至少6)中,具有相同PK的两个实体之间可以建立1对1的关系,即PK即FK。所以必须将posts
的PK设置为字符串。
为Posts
类的UserId
属性添加[Required]
属性
默认情况下,字符串属性将是可空的,但由于这是外键,并且您希望关系为Required,您必须将UserId
属性设置为非空属性,这可以通过添加[Required]
属性来完成。