Sqlite 通过构造函数指定外键对象会修改主键
我有两门课:病人课和乡村课。患者包含类型为Country的属性CountryOfOrigin。我对这种关系进行了如下建模:Sqlite 通过构造函数指定外键对象会修改主键,sqlite,entity-framework-core,Sqlite,Entity Framework Core,我有两门课:病人课和乡村课。患者包含类型为Country的属性CountryOfOrigin。我对这种关系进行了如下建模: protected override void OnModelCreating(ModelBuilder builder) { builder.Entity<Patient>().OneToOne<Country>(x => x.CountryOfOrigin); } 但
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<Patient>().OneToOne<Country>(x => x.CountryOfOrigin);
}
但是,在标有“>>”的行中出现以下异常
基于{实体类型的属性'CountryId'
“sqlliteplayder.DataAccess.Country”是只读的,因此不能
已修改或标记为已修改。}System.SystemException
{System.NotSupportedException}
调试时,我注意到以下几点:在抛出异常CountryId的行之前,一个带有私有setter的属性,按照约定被检测为主键是1。一旦抛出异常,CountryId为-1。在我的代码中,我没有更改CountryId的值,这也是不可能的,因为私有setter,所以我假设这发生在DbSet方法db.Patients.Add中。。。然而,我不明白为什么,或者如何纠正这种行为
我的最终问题是,我怎么能有外键是具体的对象而不是整数
请注意,这是一个玩具项目,要学习EF7,我确实关心数据库中当前的数据,我只想学习如何对某些场景建模。最终问题并不是我所期望的。我定义了一个私有的无参数构造函数,而不是一个受保护的无参数构造函数。EF6上的MSDN示例中没有一个提到这一点,因为它们的类没有构造函数来保持代码简短 这禁止实体框架生成代理类。这种方法的一些副作用显然是将Id设置为-1。或者这就是框架试图在下次请抛出异常时警告我的方式 解释代理类以及生成代理类所需的规则的良好参考:
OneToOne不是意味着不可能有两个来自同一个国家的病人吗?你完全正确。从乡下看应该是很多的。然而,最后一个问题似乎是另一个问题,请看我自己的答案。
var country = (from c in db.Countries
where c.Code.Equals(countryCode,
StringComparison.InvariantCultureIgnoreCase)
select c).First();
>> db.Patients.Add(new Patient(firstName, lastName, birthDate, country));
db.SaveChanges();