首页 > 解决方案 > Entity Framework Core:使用没有外键的导航属性

问题描述

我有以下对象模型:

public class SharingRelation:BaseEntity
{
    public Guid? Code { get; set; }
    public string Value { get; set; }
}

public class SecondLevelShareEntity : BaseEntity
{
    public string Name { get; set; }
    public Guid? SharingCode { get; set; }
    public List<SharingRelation> SharingRelations { get; set; }
}

在我的数据库中(它可能是糟糕的数据库设计,但我需要回答这个问题以进行研究),SharingRelation是某种依赖SecondLevelShareEntityCode == SharingCode值的实体。SecondLevelShareEntity我可以有两个具有相同SharingCode值的类型实体。因此,对于它们中的每一个,我需要SharingRelation根据CodeSharingCode值获取所有相关对象。我可以使用 SQL 并加入这些列。但是如何使用 EF Core 和导航属性来做到这一点(Include()例如,我想获取所有依赖实体)?当我像这样配置我的实体时

public class SharingRelationEntityTypeConfiguration : BaseEntityTypeConfiguration<SharingRelation>
{
    public override void Configure(EntityTypeBuilder<SharingRelation> builder)
    {
        base.Configure(builder);
        builder.HasOne<SecondLevelShareEntity>().WithMany(x => x.SharingRelations).HasForeignKey(x => x.Code)
            .HasPrincipalKey(x => x.SharingCode);
    }
}

EF Core 创建外键并将其标记为唯一。我显然得到了一个错误,这是不可能有几个SecondLevelShareEntity相同的SharingCode

System.InvalidOperationException:无法跟踪实体类型“SecondLevelShareEntity”的实例,因为已在跟踪另一个具有键值“{SharingCode: 8a4da9b3-4b8e-4c91-b0e3-e9135adb9c66}”的实例。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。

如何避免创建外键,但继续使用导航属性(据我所知,使用导航的普通查询会生成简单的JOIN语句)

更新我可以在数据库中提供真实数据。SecondLevelShareEntity表如下所示:

_id     Name                        SharingCode
----------------------------------------------------------------------
1       "firstSecondLevelEnt"       "efcb1c96-0ef1-4bb3-a952-4a6511ab448b"
2       "secondSecondLevelEnt"      "efcb1c96-0ef1-4bb3-a952-4a6511ab448b"

SharingRelation表格如下所示:

_id     Value                       Code
----------------------------------------------------------------------
1       "firstSharingRelation"      "efcb1c96-0ef1-4bb3-a952-4a6511ab448b"
2       "secondSharingRelation"     "efcb1c96-0ef1-4bb3-a952-4a6511ab448b"

标签: sqlasp.net-core.net-coreentity-framework-coreef-core-2.2

解决方案


推荐阅读