繁体   English   中英

EF6-导航属性-单项而不是集合

[英]EF6 - Navigation property - single item instead of collection

我有以下课程设置:

public class GuestDefinition
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<GuestItem> GuestItems { get; set; }
}

public class GuestItem
{
    public int Id { get; set; }

    [Index(IsUnique =true)]
    public int InvitationId { get; set; }
    public virtual Invitation Invitation { get; set; }

    public int GuestDefinitionId { get; set; }
    public virtual GuestDefinition GuestDefinition { get; set; }
}

public class Invitation
{
    public int Id { get; set; }
    public virtual GuestItem GuestItem { get; set; }
}

尝试应用以下实体框架时,会生成不正确的查询

var entry = db.Invitations.Select(p => new
{
    Id = p.Id,
    Name = p.GuestItem.GuestDefinition.Name
}).FirstOrDefault();

从EF生成的查询为:

SELECT 
[Extent1].[Id] AS [Id], 
[Extent3].[Name] AS [Name]
FROM   [dbo].[Invitation] AS [Extent1]
LEFT OUTER JOIN [dbo].[GuestItems] AS [Extent2] ON [Extent1].[Id] = [Extent2].[Id]
LEFT OUTER JOIN [dbo].[GuestDefinition] AS [Extent3] ON [Extent2].[GuestDefinitionId] = [Extent3].[Id]
WHERE [Extent1].[Id] = @p__linq__0

问题出在第一条连接线上,正确的连接应该是

LEFT OUTER JOIN [dbo].[GuestItems] AS [Extent2] ON [Extent1].[Id] = [Extent2].[InvitationId]

除了将邀请函的GuestItem转换为ICollection之外,还有什么方法可以使这项工作有效? 由于我的用例,我希望避免在每次加入调用时都使用FirstOrDefault()

您的关系是1:1。 在EF中,该技术是将非主要ID定义为KEY和FK。 因此,例如:

public class GuestItem
{
    public int Id { get; set; }

    public int GuestDefinitionId { get; set; }
    public virtual GuestDefinition GuestDefinition { get; set; }

    public virtual Invitation Invitation { get; set; }
}

public class Invitation
{
    [Key, ForeignKey("GuestItem")]
    public int GuestItemId { get; set; }
    public virtual GuestItem GuestItem { get; set; }
}

或者,如果您更喜欢流利的代码:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // Configure GuestItemId as PK for GuestItem
    modelBuilder.Entity<GuestItem>()
        .HasKey(e => e.GuestItemId);

    // Configure GuestItemId as FK for GuestItem
    modelBuilder.Entity<GuestItem>()
                .HasOptional(s => s.Invitation) 
                .WithRequired(ad => ad.GuestItemId); 

}

这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM