当列名与父表不匹配时,如何在EF Code First Fluent中映射外键?

时间:2013-08-04 04:57:26

标签: sql sql-server sql-server-2008 entity-framework entity-framework-4

我想使用Fluent API进行映射。我看到了一些其他的例子,但这些看起来与我想做的不同。

这是我的SQL:

ALTER TABLE [Question] ADD CONSTRAINT [FK_QuestionUserProfile] 
FOREIGN KEY([AssignedTo]) REFERENCES [UserProfile] ([UserId])

这给了我这个错误信息:

There are no primary or candidate keys in the referenced table 'UserProfile' 
that match the referencing column list in the foreign key 'FK_QuestionUserProfile'
Could not create constraint

我有两个班级:

public class Question
{

    public int QuestionId { get; set; }
    public string Text { get; set; }
    public int AssignedTo { get; set; }
    public int ModifiedBy { get; set; }
    public virtual UserProfile UserProfile { get; set; }
}
public partial class UserProfile
{
    public UserProfile()
    {
        this.webpages_Roles = new List<webpages_Roles>();
    }
    public int UserId { get; set; }
    public string UserName { get; set; }
    public virtual ICollection<webpages_Roles> webpages_Roles { get; set; }
    public virtual ICollection<Question> Questions { get; set; }
}

我想在问题&lt;&gt;之间进行映射UserProfile使:

  • AssignedTo映射到UserProfile中的UserId。
  • 已修改映射到UserProfile中的UserId。

到目前为止,我的问题地图

        this.HasRequired(t => t.UserProfile)
            .WithMany(t => t.Questions)
            .HasForeignKey(d => d.AssignedTo);
        this.HasRequired(t => t.UserProfile)
            .WithMany(t => t.Questions)
            .HasForeignKey(d => d.ModifiedBy);

但是这会起作用,因为ForeignKey将AssignedTo作为UserProfile中Question和UserId中的名称。是 在映射中我可以指定它们应该映射到UserId吗?

1 个答案:

答案 0 :(得分:1)

主表中的外键和主键不必具有相同的名称。将AssignedTo映射到UserId没问题。但是,您尝试定义两个关系,为此,您还需要两个导航属性。您不能在两个关系中使用UserProfile作为导航属性,也不能两次使用Questions集合。您可以像这样更改Question实体(UserProfile可以保持不变):

public class Question
{
    public int QuestionId { get; set; }
    public string Text { get; set; }
    public int AssignedTo { get; set; }
    public int ModifiedBy { get; set; }
    public virtual UserProfile AssignedToUser { get; set; }
    public virtual UserProfile ModifiedByUser { get; set; }
}

然后创建此映射:

this.HasRequired(t => t.AssignedToUser)
    .WithMany(t => t.Questions)
    .HasForeignKey(d => d.AssignedTo);

this.HasRequired(t => t.ModifiedByUser)
    .WithMany() // <- don't use "t => t.Questions" here again
    .HasForeignKey(d => d.ModifiedBy)
    .WillCasadeOnDelete(false);

对于两个关系中的至少一个,必须禁用级联删除。否则,SQL Server会抱怨多个级联删除路径。

但是,这一切都不会修复创建外键约束时的异常。此错误表示UserProfile.UserId不是UserProfile表中的主键(或通常它没有唯一约束)。也许UserId只是复合主键的一部分(或许UserId + UserName)?