c# - EF6 必需-可选关系(一对零或一)无法正常工作
问题描述
我有一对零或一的关系,我遇到的问题是依赖实体到主体实体的导航属性始终为空,除非首先从其 DbSet 加载主体实体。
数据库关系是 Employee.ID -> TrainerProfile.TrainerID,其中 TrainerID 是主键和外键。
实体是使用 [Column] 属性映射的 Employee.Id -> TrainerProfile.Id。
//Principal
public class Employee : BaseEntity<int>
{
[Key]
[Column("ID")]
public override int Id { get; protected set; }
[Required(ErrorMessage = "A Username is required")]
[DataType(DataType.Text)]
[StringLength(256)]
public string UserName { get; set; }
[Required(ErrorMessage = "A First Name is required")]
[StringLength(40)]
public string FName { get; set; }
[Required(ErrorMessage = "A Last Name is required")]
[StringLength(40)]
public string LName { get; set; }
...
}
//Dependent
public class TrainerProfile : BaseEntity<int>
{
private TrainerProfile()
{
}
protected TrainerProfile(int id) : base(id)
{
}
[Key]
[Column("TrainerID")]
public override int Id { get; protected set; }
public bool Passport { get; set; }
[StringLength(1000)]
public string SpecialConsiderations { get; set; }
[StringLength(10)]
public string SeatPreference { get; set; }
[ForeignKey("Id")]
public virtual Employee Employee { get; set; }
}
//DBContext OnModelCreating()
modelBuilder.Entity<Employee>()
.HasOptional(e => e.TrainerProfile)
.WithRequired(e => e.Employee);
modelBuilder.Entity<TrainerProfile>()
.HasKey(e => e.Id)
.HasRequired(e => e.Employee)
.WithOptional(e => e.TrainerProfile);
更新
var db = new DBContext();
var profile = db.TrainerProfiles.First(); //profile.Employee null
var employee = db.Employees.List(); //profile.Employee now loaded
解决方案
我能够通过将默认构造函数访问器从私有更改为受保护来解决这个问题。
//Dependent
public class TrainerProfile : BaseEntity<int>
{
protected TrainerProfile() //***Changed from private to protected***
{
}
protected TrainerProfile(int id) : base(id)
{
}
[Key]
[Column("TrainerID")]
public override int Id { get; protected set; }
public bool Passport { get; set; }
[StringLength(1000)]
public string SpecialConsiderations { get; set; }
[StringLength(10)]
public string SeatPreference { get; set; }
[ForeignKey("Id")]
public virtual Employee Employee { get; set; }
}
推荐阅读
- angularjs - 当我通过 ui-tabset 中的 select 更改我的 $scope.model 时,它不会相应更改
- ios - 如何使用 NSPredicate 过滤存储在 CoreData 中的数组?
- ansible - 在其他角色中使用注册变量
- pandas - 加入复杂的熊猫表
- tensorflow - Keras 没有学到任何东西
- python - 我将不胜感激有关使用 Python 解析复杂的制表符分隔的文本文件的评论
- python - 有没有办法在内部存储所有日志记录历史并仅在必要时导出到文件?
- import - 是否可以使用单个代码导入 2 个文件?或者如何从一个目录中导入所有文件?
- php - 无法自定义 inline_keyboard
- typescript - 如何修复“tsc:找不到命令”