Sqlite 通过构造函数指定外键对象会修改主键

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); } 但

我有两门课:病人课和乡村课。患者包含类型为Country的属性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();