【问题标题】:Foreign key to the same table in EF - Getting an errorEF 中同一个表的外键 - 出现错误
【发布时间】:2013-06-11 17:11:56
【问题描述】:

基本上我得到了下表:

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

我做错了什么?

【问题讨论】:

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


    【解决方案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<>

    【讨论】:

    • 我更改了您告诉我的内容并将代码行更改为: WebSecurity.CreateUserAndAccount(model.UserName, model.Password, propertyValues: new { AffiliateId = associateId, Referer_UserId = referer.UserId }) ;现在它显然有效:)
    【解决方案2】:

    因为你传递的是profile,所以语法不应该是referer.UserId吗?

    【讨论】:

    • 我尝试将其更改为Referer,UserId,但现在我收到以下错误:无效的列名'Referer'。
    • 我看到你通过传递实体解决了这个问题。在我的回复中,referrer 这个词是用小写的 r 拼写的。
    猜你喜欢
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    • 2023-03-07
    • 2019-05-22
    • 2015-07-16
    • 2023-03-27
    相关资源
    最近更新 更多