EF中同一个表的外键 - 获取错误

时间:2013-06-14 23:55:21

标签: c# asp.net-mvc database entity-framework database-design

基本上我得到了下表:

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

其中有一个外键(Referer)。 但问题是,当我尝试插入新行时:

WebSecurity.CreateUserAndAccount(model.UserName, model.Password, propertyValues: new { AffiliateId = affiliateId, Referer = referer });

这里的变量“referer”是一个实际的UserProfile。 我收到以下错误: 从对象类型UserProfile到已知的托管提供程序本机类型不存在映射。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

我假设您尝试引用不同的 UserProfile对象作为引荐来源,在这种情况下您不想使用主键(UserId)作为传递给ForeignKey属性的值。相反,您应该声明另一个int属性作为Referrer对象的FK,并使用ForeignKey告诉EF将其用作Referer导航属性的FK,或者根本不使用完全使用ForeignKey让EF为您生成关键列:

[Table("UserProfile")]
public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    // ...
    public UserProfile Referer { get; set; } // EF will generate Referer_UserId
}

ForeignKey属性用于告诉实体框架如何将导航属性与相应的FK列匹配 - 它不用于标识引用对象的主键。)

现在,话虽如此,我不确定是否会导致您目前的错误:

No mapping exists from object type UserProfile to a known managed provider native type.

检查以确保在AccountModels.cs中的DbContext对象中定义了DbSet<UserProfile> UserProfiles。如果您的UserProfile对象实际上引用了您未在上面的示例代码中显示的任何其他类型,请确保这些类型也有DbSet<>

答案 1 :(得分:0)

因为您正在传递配置文件,所以语法不应该是referer.UserId吗?