【问题标题】:Related many to one navigation properties not loading with EF code first与多对一导航属性相关的不是首先加载 EF 代码
【发布时间】:2014-02-12 01:11:56
【问题描述】:

我正在努力首先使用 EF 代码加载一些相关的导航属性。

我有一个 User 表,它是我的主表,每次更新它时,它都会生成一个仅包含基本信息的 UserLight 对象。这是通过与 User 的一对一映射来链接的,因此 User 对象会生成身份密钥,然后在保存时,会使用该 UserId 作为其密钥来创建 UserLlight 对象。

我现在有两个用户之间的对话对象,出于性能原因,我只想为发送者和接收者加载 UserLight 对象。我尝试使用 Fluent 和 CF 进行映射,但是当我从存储库加载对象时,仅填充了 UserStartedId 和 UserRecipientId 整数字段,实际的 UserLight 对象 UserStarted 和 UserRecipient 为空。

我的会话类如下

public class DbConversation 
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long ConversationId { get; set; }

    public virtual DbUserLight UserStarted { get; set; }
    public int UserStartedId { get; set; }

    public virtual DbUserLight UserRecipient { get; set; }
    public int UserRecipientId { get; set; }

    public virtual IList<DbStoryMessage> Messages { get; set; }
}

我的Userlight类如下(略)

public class DbUserLight 
{
    public int UserId { get; set; }

    [Required]
    [MaxLength(50)]
    public string FirstName { get; set; }

    [Required]
    public DateTime DateOfBirth { get; set; }
}

我的 DbContext OnModelCreating 有以下内容

modelBuilder.Entity<DbUserLight>()
    .HasKey(a => a.UserId);
modelBuilder.Entity<DbUserLight>()
    .Property(a => a.UserId)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

modelBuilder.Entity<DbStoryConversation>()
    .HasKey(c => c.ConversationId);
modelBuilder.Entity<DbStoryConversation>()
    .Property(c => c.ConversationId)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<DbStoryConversation>()
    .HasMany<DbStoryMessage>(c => c.Messages)
    .WithRequired(m => m.Conversation)
    .WillCascadeOnDelete(true);

我的存储库调用如下

public IQueryable<DbStoryInboxMessage> GetInboxMessages()
{
    return Work.Context.StoryInboxMessages
        .Include(i => i.Conversation.UserStarted)
        .Include(i => i.Conversation.UserRecipient)
        .Include(i => i.Conversation.Messages);
}

谁能解释为什么这不起作用?

【问题讨论】:

  • 这是一个网络或桌面应用程序?

标签: c# entity-framework ef-code-first


【解决方案1】:

您是否尝试添加外键注释?

    public class DbConversation 
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long ConversationId { get; set; }
    [ForeignKey("UserStartedId")]
    public virtual DbUserLight UserStarted { get; set; }
    public int UserStartedId { get; set; }
    [ForeignKey("UserRecipientId")]
    public virtual DbUserLight UserRecipient { get; set; }
    public int UserRecipientId { get; set; }

    public virtual IList<DbStoryMessage> Messages { get; set; }
}

【讨论】:

  • 这可能有帮助,但你能通过显示流畅的版本来承认 OP 的风格吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多