实体框架核心:使用没有外键的导航属性

时间:2019-08-26 15:37:45

标签: sql asp.net-core .net-core entity-framework-core ef-core-2.2

我有以下对象模型:

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; }
}

在我的数据库中(数据库设计可能很差,但是我需要回答这个问题进行研究),SharingRelationSecondLevelShareEntityCode == SharingCode值的某种依赖实体。我可以有两个SecondLevelShareEntity类型的实体,它们的值相同SharingCode。因此,对于每个对象,我都需要根据SharingRelationCode的值获取所有相关的SharingCode对象。我可以使用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"

0 个答案:

没有答案