如何配置一对多引用同一主体?

问题描述

我有一个Message,可以有很多线程。我将 thread 称为MessageThreadMessageThread实际上只封装了线程所有者Message)和响应,也封装了 Message

public class Message {
    public int Id {get; set;}
    
    // other properties
    
    public ICollection<MessageThread> Threads {get; set;}
}

public class MessageThread {
    public int Id {get; set;}
    public Message Owner {get; set;}
    public int ThreadId {get; set;}
    public virtual Message Thread {get; set;}
}

//  EntityFramework configurations
public class MessageConfiguration : IEntityTypeConfiguration<Message> {
    public void Configure(EntityTypeBuilder<Message> builder) {
        builder.HasMany(message => message.Threads)
            .WithOne(messageThread => messageThread.Thread)
            .HasForeignKey(message => message.Id);
    }

}

public class MessageThreadConfiguration : IEntityTypeConfiguration<MessageThread> {
    public void Configure(EntityTypeBuilder<MessageThread> builder) {
        builder.HasOne(messageThread => messageThread.Thread)
            .WithMany(message => message.Threads)
            .HasForeignKey(messageThread => messageThread.ThreadId);
    }
}

...这是保存到数据库方法

public async Task<Message> CreateThreadAsync(int parentId,Message threadMessage,IEnumerable<Tag> tags,CancellationToken cancellationToken) {
    //  create the message record
    threadMessage = await CreateMessageAsync(threadMessage,tags,cancellationToken);

    using (var context = new DataContext()) {
        context.Messages.Attach(threadMessage);

        //  query parent message
        var parentMessage = await context.Messages
            .Where(message => message.Id == parentId)
            .Include(message => message.Threads)
            .SingleOrDefaultAsync(cancellationToken);

        if (parentMessage.Threads == null) {
            parentMessage.Threads = new List<MessageThread>();
        }

        parentMessage.Threads.Add(new MessageThread() {
            Owner = parentMessage,Thread = threadMessage
        });

        await context.SaveChangesAsync(cancellationToken);
    }

    return threadMessage;
}

单个消息将按预期方式保存(参见图片)。但是,请参见下面的MessageThreads表(带圆圈的 ):

enter image description here

如何解决这种关系,以便ThreadId引用正确的消息?在这种情况下,2

期望
假设以下消息:

enter image description here

...则消息线程为:

enter image description here

这是One-to-ManyMessage间的MessageThread关系。我是否配置正确?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)