Entity framework 4 首先使用EF代码审核表

Entity framework 4 首先使用EF代码审核表,entity-framework-4,ef-code-first,entity-framework-mapping,Entity Framework 4,Ef Code First,Entity Framework Mapping,我有一个课堂发言信息如下: public class Message { public int Id{get;set;} public string MessageText{get;set;} public int Sender{get;set;} public DateTime CreatedOn{get;set;} //EDIT:2 public virtual Message RepliedTo{get;set;} public v

我有一个课堂发言信息如下:

public class Message
{
    public int Id{get;set;}
    public string MessageText{get;set;}
    public int Sender{get;set;}
    public DateTime CreatedOn{get;set;}

    //EDIT:2
    public virtual Message RepliedTo{get;set;}
    public virtual IList<Message> Replies{get;set;}
    public virtual IList<MessageStatusHistory> History{get;set;}
    //so on and so forth
}
对于如何设置Message和MessageStatusHistory类的映射,以便从对象本身获取消息的所有历史,我感到困惑

此外,状态历史记录表只有在某些用户将其标记为已读时才会有条目

编辑:2我为消息配置了映射,如下所示:

ToTable("Messages");
HasOptional(x => x.RepliedTo).WithMany(x => x.Replies)
    .Map(n => n.ToTable("Messages"));
对于MessageStatusHistory,映射为:

HasRequired(x => x.Message).WithMany(n => n.History)
       .HasForeignKey(x => x.MessageId)
现在,当我运行以下测试时:

using (IKernel ker = new StandardKernel())
{    
    ker.Rebind<IDbContext>().To<MessageDbContext>();
    ker.Rebind<IRepository<Message>>().To<EFRepository<Message>>();
    ker.Rebind<IRepository<MessageStatusHistory>>()
                   .To<EFRepository<MessageStatusHistory>>();

    var svc = ker.Get<MessageService>();
    var message = svc.Create("hello world", 1, "user2@example.com");
    var nn = svc.AddReplyToMessage(message, "Message 2", 1, "user2@example.com");
    var nnn = svc.AddReplyToMessage(nn, "Message 3", 2, "user1@example.com");

    var nhs = ker.Get<MessageStatusHistoryService>();

    nhs.Create(message, Status.MarkedRead, 2, "user1@example.com");
    nhs.Create(message, Status.MarkedRead, 1, "user2@example.com");
    nhs.Create(nnn, Status.MarkedRead, 2, "user1@example.com");
    nhs.Create(nn, Status.MarkedRead, 1, "user2@example.com");
    nhs.Create(nn, Status.MarkedRead, 2, "user1@example.com");
}

创建状态历史对象的行正在重新插入消息对象:我认为这是因为映射中的HasRequiredx=>x.Message内容。但不确定。请帮助解决此问题。

我认为映射很好。尝试确保您的服务类使用相同的底层上下文实例。
using (IKernel ker = new StandardKernel())
{    
    ker.Rebind<IDbContext>().To<MessageDbContext>();
    ker.Rebind<IRepository<Message>>().To<EFRepository<Message>>();
    ker.Rebind<IRepository<MessageStatusHistory>>()
                   .To<EFRepository<MessageStatusHistory>>();

    var svc = ker.Get<MessageService>();
    var message = svc.Create("hello world", 1, "user2@example.com");
    var nn = svc.AddReplyToMessage(message, "Message 2", 1, "user2@example.com");
    var nnn = svc.AddReplyToMessage(nn, "Message 3", 2, "user1@example.com");

    var nhs = ker.Get<MessageStatusHistoryService>();

    nhs.Create(message, Status.MarkedRead, 2, "user1@example.com");
    nhs.Create(message, Status.MarkedRead, 1, "user2@example.com");
    nhs.Create(nnn, Status.MarkedRead, 2, "user1@example.com");
    nhs.Create(nn, Status.MarkedRead, 1, "user2@example.com");
    nhs.Create(nn, Status.MarkedRead, 2, "user1@example.com");
}