Entity Framework Core:如何获取使用 2 个组合键引用表 A 的表 B

问题描述 投票:0回答:1

我正在使用 EF Core 6 首先使用 DB 将数据库表映射到实体类。

我的表

Conversation_Users
有一个由 2 列组成的复合主键,它引用 C# 中描述的其他 2 个实体(
Conversation
User
),如下所示:

public class Conversation_Users
{
    [Key]
    [Column(Order = 0)]
    public long ConversationId { get; set; }

    [Key]
    [Column(Order = 1)]
    public long UserId { get; set; }

    public string Name { get; set; }

    // other properties

    public virtual Conversation Conversation { get; set; }  // entity C, nevermind on it

    public virtual User User { get; set; }  // entity D, nevermind on it
}

我有其他表

Message
,其中包含带有2个外键的表
Conversation_Users
的参考

[Table("Message")]
public class Message
{
    public long Id { get; set; }

    [ForeignKey("ConversationId")]
    public long ConversationId { get; set; }

    [ForeignKey("UserId")]
    public long SenderId { get; set; }

    [ForeignKey("ReferenceMessageId")]
    public long ReferenceMessageId { get; set; }

    // other properties

    public virtual Message ReferenceMessage { get; set; }  // refer to itself

    public virtual Conversation Conversation { get; set; }  // entity C, nevermind on it

    public virtual User Sender { get; set; }  // entity D, nevermind on it
}

从实体

Message
(消息)的实例中,如何获取实体
Name
中的值
Conversation_Users
属性?

entity-framework-core composite-primary-key
1个回答
0
投票

可以通过 LINQ 查询。

// input parameters
var messageId = ...

var query = 
    from m in context.Messages
    where m.Id == messageId
    join cu in context.Conversation_Users on 
       new { m.ConversationId, UserId = m.SenderId } equals 
       new { cu.ConversationId, cu.UserId }
    select cu.Name;

var conversationName = query.FirstOrDefault();

无论如何,这是可疑的模型设计,它应该包含适当的导航属性。看起来是多对多的关系。

© www.soinside.com 2019 - 2024. All rights reserved.