相关的多个导航属性首先不加载EF代码

时间:2014-02-11 15:35:00

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

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

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

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

我的会话课程如下

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

任何人都可以解释为什么这不起作用吗?

1 个答案:

答案 0 :(得分:0)

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

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