我有以下对象模型:
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
是SecondLevelShareEntity
对Code == SharingCode
值的某种依赖实体。我可以有两个SecondLevelShareEntity
类型的实体,它们的值相同SharingCode
。因此,对于每个对象,我都需要根据SharingRelation
和Code
的值获取所有相关的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"