Entity Framework Core 5.0.3 - 具有影子属性外键的一对一映射

问题描述

对于我的一生,我无法让它正常工作。我有一个相对简单的域模型,它有几个导航属性,我想通过预先加载来填写这些属性

为了保持我的域模型纯净,我选择使用影子属性作为外键,因此客户端代码无法访问它们。

这是领域模型:

public class CourseType : Entity
{
    protected CourseType() { }

    public CourseType(string name,CoachGroup coachGroup,bool active)
    {
        Name = name;
        CoachGroup = coachGroup;
        Active = active;
    }

    public string Name { get; private set; }
    private int? _coachGroupId;
    private int? CoachGroupId => _coachGroupId;
    public virtual CoachGroup CoachGroup { get; private set; }
    public int? AgeLimit { get; private set; }
    public bool Active { get; private set; }
    public bool ShowInSearchForm { get; private set; }
    private List<Course> _accessgivingCourses = new List<Course>();
    public virtual IReadOnlyList<Course> AccessgivingCourses => _accessgivingCourses?.ToList();
}

这是我连接配置的方式:

public class CourseTypeConfiguration : IEntityTypeConfiguration<CourseType>
{
    public void Configure(EntityTypeBuilder<CourseType> builder)
    {
        builder.ToTable("CourseTypes","Courses");

        builder.HasKey(p => p.Id);

        builder.Property(p => p.Id).HasColumnName("CourseTypeId");
        builder.Property(p => p.Name).HasColumnName("CourseTypeName");
        builder.Property(p => p.Active).HasColumnName("IsActive");
        builder.Property(p => p.ShowInSearchForm).HasColumnName("ShowInSearchForm");
        builder.Property(p => p.AgeLimit).HasColumnName("AgeLimit");
        builder.Property<int?>("CoachGroupId").HasField("_coachGroupId");

        builder.HasOne(p => p.CoachGroup).WithOne().HasForeignKey<CourseType>("CoachGroupId").OnDelete(DeleteBehavior.Restrict);
        builder.HasMany(p => p.AccessgivingCourses).WithMany("AccessgivingCourses")
            .UsingEntity<Dictionary<string,object>>("CourseTypesAccessgivingCourses",j => j.HasOne<Course>().WithMany().HasForeignKey("CourseId"),j => j.HasOne<CourseType>().WithMany().HasForeignKey("CourseTypeId"),j => j.ToTable("CourseTypesAccessgivingCourses")
            );

        builder.HasIndex("CoachGroupId").IsUnique(false);
    }
}

这是我通过存储库类提取数据的方式:

public override async Task<IEnumerable<CourseType>> GetAll()
{
    try
    {
        return await Context.CourseTypes.Include(i => i.CoachGroup).Include(i => i.AccessgivingCourses).ToListAsync();
    }
    catch (Exception e)
    {
        Logger.LogCritical(e,$"Could not retrieve list of course type entities");
        throw;
    }
}

几乎有效,除了当我添加或更新实体时,CoachGroup 链接随机丢失一些更新。对于其他人,它工作得很好。这就像 Entity Framework Core 或数据库随机失去对它的跟踪。这很奇怪,因为当我查看数据库表时,表中的外键都在那里!?

有谁知道我到底做错了什么?或者这是否是解决这个问题的正确方法?我想要做的就是加载相关数据,但现在已经到了仅仅将几个可选关系链接在一起就成为火箭科学的地步...

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...