导航属性和映射的EF问题

时间:2012-03-09 16:24:59

标签: entity-framework-4.1

一开始我想提一下,我已经和这个东西打了几天,并尝试了很多与这个问题或多或少相关的答案。但我无法解决它。

我有两个代表DB中的表的类。这些是遗留应用程序使用的现有表,我无法更改它们。

邮件可以有多个MessageRecipients。

环境:MVC3,EF4.1

课程是:

public class Message
{
    [ForeignKey("MessageReciepients")]
    public virtual int MessageID { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime Recieved { get; set; }
    [ForeignKey("User")]
    public int AuthorUserID { get; set; }

    //P\\ Navigation properties
    public virtual IList<MessageRecipient> MessageReciepients { get; set; }
    public virtual User User { get; set; }
}

public class MessageRecipient
{
    //[Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int MessageID { get; set; }
    public int UserID { get; set; }
    public bool Read { get; set; }
    public bool Important { get; set; }
    public bool Deleted { get; set; }
    public bool Destroyed { get; set; }

    //P\\ Navigation Properties
    public virtual User User { get; set; }
}

我遇到的错误是:

  

外键组件'MessageID'不是声明的属性   输入'MessageRecipient'。验证它是否未明确   从模型中排除,并且它是一个有效的原始属性。

如何正确映射这些类,关系以加载邮件的收件人?

我可以添加导航属性User可以正常使用Message并正确加载用户数据。

我对.NET不太熟悉,而且在学习这些时我学到了很多东西。 我尝试了一些EF API配置来映射这些我试过咒骂它,诅咒它,并且接近哭泣并同时祈祷。没有喜悦!!

我真的很感激帮助。

2 个答案:

答案 0 :(得分:1)

填写缺失的属性:

public class Message 
{
    public int MessageID { get; set; }
}

public class MessageRecipient 
{
    public int MessageID { get; set; }

    [ForeignKey("MessageID")]
    public Message Message { get; set; }
}

答案 1 :(得分:1)

事实证明问题出在我需要使用的复合键上,所有这些都可以用一些属性来解决:

现在的样子:

public class Message
{
    public int MessageID { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime Recieved { get; set; }

    [ForeignKey("User")]
    public int AuthorUserID { get; set; }

    //P\\ Navigation properties
    public virtual ICollection<MessageRecipient> MessageRecipients { get; set; }
    public virtual User User { get; set; }
}

public class MessageRecipient
{
    [Key, Column(Order=0), ForeignKey("User")]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int UserID { get; set; }

    [Key, Column(Order = 1)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int MessageID { get; set; }

    public bool Read { get; set; }
    public bool Important { get; set; }
    public bool Deleted { get; set; }
    public bool Destroyed { get; set; }

    //P\\ Navigation Properties
    public virtual User User { get; set; }
}