1

如果这已经在某个地方得到了回答,请提前抱歉,但我四处搜索却找不到答案。

我正在尝试链接 UserProfile 和 Reviewer 表。Reviewer 是应用程序中的一类用户,因此两个表之间的关系是一(UserProfile)到零/一(Reviewer)。

UserProfile 模型是:

[Table("UserProfile")]
public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string UserName { get; set; }

    public virtual Reviewer Reviewer { get; set; }
} 

审稿人等级:

public class Reviewer
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    [ForeignKey("UserProfile")]
    public int ReviewerID { get; set; }

    public string Email { get; set; }
    // other properties of Reviewer...

    public virtual UserProfile UserProfile { get; set; }

}

换句话说,我试图将外键 UserId 设置为表 Reviewer 的键,名称为 ReviewerID。

我将 fluent API 指定如下:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        // other fluent API...

        modelBuilder.Entity<UserProfile>()
                .HasOptional(x => x.Reviewer).WithRequired(x => x.UserProfile);

    }

但是,Code First 生成的数据库并不是我想要的。

假设我在 UserProfile 表中有以下条目:UserId = 4, UserName = lostman1

我尝试手动向 Reviewer 表中插入一条新记录:ReviewerID = 4, Email = d@d.com

事实证明,我无法更新数据库中的 ReviewerID 字段,因为它是一个自动递增的字段。此外,我收到以下错误:

第 4 行中的数据未提交。
错误来源:SQL Server Compact ADO.NET 数据提供程序。
错误消息:无法插入外键值,因为相应的主键 > 值不存在。[外键约束名 = FK_dbo.Reviewer_dbo.UserProfile_ReviewerID]

我的代码第一次设置有什么问题?非常感谢!

4

2 回答 2

1

在我看来,您需要在 Reviewer 和 User 之间建立 UserID FK 关系。在这样的设计中,并非所有用户都必须是审阅者,但所有审阅者都必须是用户。

我也开始认为,您可能因为没有在系统中使用角色概念而使事情变得过于复杂。通常,将根据用户具有的角色指定用户与审阅者。通过这种方式,所有用户将是相同的并且在表中保存相同的数据,唯一的区别是用户具有不同的角色。

使用角色与执行复杂的表连接或可为空的 FK 关系时,授权和身份验证也变得更加简单。

于 2013-08-14T06:47:49.553 回答
0

不知道你的问题是否解决了,如果没有,你可以试试这样的

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>().HasOptional(x => x.Reviewer).WithRequired(x => x.User).Map(x => x.MapKey("UserId"));
        base.OnModelCreating(modelBuilder);
    }

这是我的模型声明

public class User
{
    [Key]
    public int UserId { get; set; }
    public string UserName { get; set; }

    public virtual Reviewer Reviewer { get; set; }
}
public class Reviewer
{
    [Key]
    public int ReviewerId { get; set; }

    public virtual User User { get; set; }
}
于 2013-08-16T05:40:17.400 回答