C# EF6-导航属性-单个项而不是集合
我有以下课程设置:C# EF6-导航属性-单个项而不是集合,c#,entity-framework,C#,Entity Framework,我有以下课程设置: 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; } [I
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; }
}
从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]
除了把邀请函变成一个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);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
//将GuestItemId配置为GuestItem的主键
modelBuilder.Entity()
.HasKey(e=>e.mid);
//将GuestItemId配置为GuestItem的FK
modelBuilder.Entity()
.has可选(s=>s.Invitation)
.WithRequired(ad=>ad.MID);
}
请参见您的关系是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);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
//将GuestItemId配置为GuestItem的主键
modelBuilder.Entity()
.HasKey(e=>e.mid);
//将GuestItemId配置为GuestItem的FK
modelBuilder.Entity()
.has可选(s=>s.Invitation)
.WithRequired(ad=>ad.MID);
}
请参见谢谢您的帮助,但是,是否有一种方法可以使用当前设置映射它?我希望避免迁移数据。我正在使用一种变通方法,在需要这些数据的地方应用LINQ连接条件,但是导航属性将是一种更优雅的解决方案navigation properties=relationships意味着您必须使用表键。您的看法是正确的,加入是解决方法。感谢您的帮助,但是,是否有一种方法可以使用当前设置映射它?我希望避免迁移数据。我正在使用一种变通方法,在需要这些数据的地方应用LINQ连接条件,但是导航属性将是一种更优雅的解决方案navigation properties=relationships意味着您必须使用表键。您的看法是正确的,连接是解决方法。