【发布时间】:2016-01-20 18:24:05
【问题描述】:
我首先与 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: : 多重性在关系“UserDetail_User”中的角色“UserDetail_User_Source”中无效。因为从属角色属性不是关键属性,所以从属角色的多重性的上限必须是'*'。
我需要做什么才能让它工作?这应该没那么难吧?
根据@steve-green 的评论在下面更新
我像史蒂夫建议的那样配置了 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; }
}
【问题讨论】:
-
那略有不同。我的模型无法在主键上添加 [ForeignKey] 属性。因为我的所有模型都继承自具有主键的基本模型类。我将更新我的代码示例
标签: entity-framework ef-code-first