[英]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.