【问题标题】:EF Problems with Navigation Properties and Mapping导航属性和映射的 EF 问题
【发布时间】:2012-03-27 02:33:37
【问题描述】:

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

我有两个类代表数据库中的表。这些是旧应用程序使用的现有表,我无法更改它们。

消息可以有多个消息接收者。

环境: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”不是在 键入“消息收件人”。确认它没有被明确 从模型中排除并且它是一个有效的原始属性。

如何正确映射这些类、关系以加载消息的接收者?

我可以添加导航属性 User 可以正确地为 Message 工作并正确加载 User 的数据。

我对 .NET 不太熟悉,我在做这件事的同时学习。 我尝试了一些 EF API 配置来映射这些我尝试咒骂它,诅咒它,并且几乎同时哭泣和祈祷。不高兴!!

非常感谢您的帮助。

【问题讨论】:

标签: entity-framework-4.1


【解决方案1】:

填写缺失的属性:

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

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

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

【讨论】:

  • 顺便说一句,如果您在将Message 类的引用放入MessageRecipient 类时需要实体对象之间的标准关系,EF 将自动进行适当的关联
  • 感谢您的回答,但 Message 类中的第一个属性已经是 MessageID
  • 我已经按照你说的做了,但现在我得到了 {"Invalid column name 'Message_MessageID'.\r\nInvalid column name 'Message_MessageID'."} {SELECT [Extent1].[MessageID ] AS [MessageID], [Extent1].[UserID] AS [UserID], [Extent1].[Read] AS [Read], [Extent1].[Important] AS [Important], [Extent1].[Deleted] AS [Deleted], [Extent1].[Destroyed] AS [Destroyed], [Extent1].[Message_MessageID] AS [Message_MessageID] FROM [dbo].[Message_Recipients] AS [Extent1]}
  • 由于您的数据库已经存在,可能更容易导入模型而不是手动创建类
【解决方案2】:

原来问题出在我需要使用的复合键上,而这一切都可以通过一些属性来解决:

这就是现在的样子:

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; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 2023-02-10
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    相关资源
    最近更新 更多