如何解决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 举报,一经查实,本站将立刻删除。