我有两节课.如何使用实体框架代码第一种方法将这两个类转换为一对一的关系?
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; }
}
Run Code Online (Sandbox Code Playgroud)
当我尝试这个时,我得到这个错误:Multiplicity在关系'Region_Factory'中的Role'Region_Factory_Source'中无效.由于"从属角色"属性不是关键属性,因此从属角色的多重性的上限必须为"*".
Cla*_*ies 39
由于virtual关键字,这在CodeFirst中发生.实际上,您正在创建一种关系,其中创建一个项目需要创建另一个项目.但是,virtual关键字允许延迟实例化,这意味着创建一种类型的对象不会自动创建另一种类型,从而允许外部项目上的Id为null.这意味着0..1关系,但由于每一方都是虚拟的,所以你得到的是0..0这是不允许的.
您可以使用两种方法来纠正这种情况.
Region中添加属性FactoryId和Factory添加属性RegionId还有其他方法可以帮助实体框架确定哪个对象是从属对象,即使用Entity Framework Fluent api.
来自MSDN
配置两端都需要的关系(一对一)
在大多数情况下,实体框架可以推断哪种类型是依赖关系,哪种类型是关系中的主体.但是,当关系的两端都是必需的或双方都是可选的时,实体框架无法识别依赖关系和主体.当需要关系的两端时,在HasRequired方法之后使用WithRequiredPrincipal或WithRequiredDependent.当关系的两端都是可选的时,请在HasOptional方法之后使用WithOptionalPrincipal或WithOptionalDependent.
以下代码将创建Factory具有Dependent 的PrincipalRegion
// 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);
Run Code Online (Sandbox Code Playgroud)
小智 5
EF6,添加属性:
[Key]
public int RegionId { get; set; }
[Key, ForeignKey("Region")]
public int FactoryId { get; set; }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23694 次 |
| 最近记录: |