【发布时间】: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