Entity framework 首先使用代码的实体框架1对1关系。怎样?
我有两节课。如何使用实体框架代码优先方法将这两个类转换为一对一关系Entity framework 首先使用代码的实体框架1对1关系。怎样?,entity-framework,Entity Framework,我有两节课。如何使用实体框架代码优先方法将这两个类转换为一对一关系 public class Region { public int RegionId { get; set; } public string Name { get; set; } public virtual Factory _factory { get; set; } } public class Factory { public int FactoryId { get; set; } public st
public class Region
{
public int RegionId { get; set; }
public string Name { get; set; }
public virtual Factory _factory { get; set; }
}
public class Factory
{
public int FactoryId { get; set; }
public string Name { get; set; }
public virtual Region _region { get; set; }
}
当我尝试此操作时,会出现以下错误:
多重性在关系“Region\u Factory”中的角色“Region\u Factory\u Source”中无效。由于从属角色属性不是键属性,因此从属角色的多重性上限必须为“*”。这在CodeFirst中发生,因为虚拟关键字。实际上,您正在创建一种关系,其中创建一项需要创建另一项。但是,virtual关键字允许延迟实例化,这意味着创建一个类型的对象不会自动创建另一个类型,从而允许外部项上的Id为null。这意味着一个0..1关系,但由于每一方都是虚拟的,所以得到的是一个0..0,这是不允许的 有两种方法可以用来补救这种情况
Region
上为FactoryId
添加属性,在Factory
上为RegionId
工厂
,其中包含一个从属区域
// Configure the primary key for the Region
modelBuilder.Entity<Region>()
.HasKey(t => t.RegionId);
modelBuilder.Entity<Factory>()
.HasRequired(t => t.Region)
.WithRequiredPrincipal(t => t.Factory);
//为区域配置主键
modelBuilder.Entity()
.HasKey(t=>t.RegionId);
modelBuilder.Entity()
.HasRequired(t=>t.Region)
.具有所需的委托人(t=>t.Factory);
EF6,添加属性:
[Key]
public int RegionId { get; set; }
[Key, ForeignKey("Region")]
public int FactoryId { get; set; }
令人困惑的是,根据这个链接,虚拟关键词应该对关系没有影响。那个MSDN摘录很有帮助!我怀疑时间已经流逝,部分答案无效(当然不是你的错,呵呵)。到了EF6(也可能是EF5,对此不确定),人们就不能再这样做了。我刚刚对我的一个学生进行了测试(两个都有显式外键属性,每次都在两个上删除虚拟属性)。但是没有饼干。。。我想FluidApi是唯一的方法,除非有人质疑1:1关系的有效性(考虑将两个实体放在同一个表中)。你怎么认为?你能确认/记录我的评论吗?这个解决方案不会创建一个复合密钥吗?