我首先与EF代码作斗争并试图以1:1的关系进行映射而没有快乐。
用户基本上可以拥有用户详细信息。
我在两个表上设置主键。在我的UserDetail表上有UserId字段我试图用作FK。
public class User:BaseModel
{
public virtual UserDetail UserDetail { get; set; }
public string UserName { get; set; }
}
public class UserDetail:BaseModel
{
public virtual User User { get; set; }
[ForeignKey("User")]
public int UserId { get; set; }
public string UserDetailName { get; set; }
}
public class BaseModel{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
}
当我尝试使用add-migration
命令时,我收到此错误
UserDetail_User_Source :: Multiplicity在Role' UserDetail_User_Source'中无效。 in relationship' UserDetail_User'。由于Dependent Role属性不是关键属性,因此Dependent Role的多重性的上限必须为' *'。
我需要做些什么才能让这个工作?当然这不应该那么困难吗?
根据@ steve-green
的评论更新以下内容
我配置了像steve建议的fluentapi
modelBuilder.Entity<User>()
.HasRequired(t => t.UserDetail)
.WithRequiredPrincipal(t => t.User);
然而,生成的迁移步骤对我来说是错误的
CreateTable(
"dbo.Users",
c => new
{
UserId = c.Int(nullable: false, identity: true),
UserName = c.String(),
})
.PrimaryKey(t => t.UserId);
CreateTable(
"dbo.UserDetails",
c => new
{
UserDetailId = c.Int(nullable: false, identity: true),
UserId = c.Int(nullable: false),
UserDetailName = c.String(),
})
.PrimaryKey(t => t.UserDetailId)
.ForeignKey("dbo.Users", t => t.UserDetailId)
.Index(t => t.UserDetailId);
FK配置为UserDetailId
,不应该是UserId
?
略有修改的模型
public class UserDetail
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int UserDetailId { get; set; }
public virtual User User { get; set; }
public int UserId { get; set; }
public string UserDetailName { get; set; }
}
答案 0 :(得分:0)
删除属性
[ForeignKey("User")
在UserDetail中。另外,我会添加
int UserDetailId
到用户
那应该有用。
答案 1 :(得分:0)
如果要使用基表,则不能使用注释,因为(如您所述)所需的依赖关键字需要是外键。你需要流畅的api代码:
modelBuilder.Entity<User>()
.HasRequired(t => t.UserDetail)
.WithRequiredPrincipal(t => t.User);
https://msdn.microsoft.com/en-us/data/jj591620.aspx#RequiredToRequired