0

基本上我得到了下表:

    [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 到已知托管提供程序本机类型的映射。

我究竟做错了什么?

4

2 回答 2

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.

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

于 2013-06-15T00:57:03.227 回答
0

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

于 2013-06-15T00:04:19.377 回答