Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF6-导航属性-单个项而不是集合_C#_Entity Framework - Fatal编程技术网

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意味着您必须使用表键。您的看法是正确的,连接是解决方法。