Amm*_*han 4 entity-framework ef-code-first
我正在尝试使用代码创建一对多和反向一对一的关系.这是我想做的事情
1)两个类之间的一对多,它按预期工作.
public class X
{
[Key]
public int XId { get; set; }
public ICollection<Y> Y { get; set; }
}
public class Y
{
[Key]
public int YId { get; set; }
public int XId { get; set; }
public X X { get; set; }
}
public class DataContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Y>()
.HasRequired(y => y.X)
.WithMany(x => x.Y)
.HasForeignKey(y => y.XId);
}
}
Run Code Online (Sandbox Code Playgroud)
现在我要做的是在Y和X之间创建Reverse One-to-One可选关系,这样X将包含Y的外键......怎么可能?这是我想要做的,它抛出一些Multiplicity错误
public class X
{
[Key]
public int XId { get; set; }
public ICollection<Y> Y { get; set; }
public int YId {get; set; }
[ForiegnKey("YId")]
public Y YOptional { get; set; }
}
public class Y
{
[Key]
public int YId { get; set; }
public int XId { get; set; }
public X X { get; set; }
public X XOptional {get; set; }
}
public class DataContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Y>()
.HasRequired(y => y.X)
.WithMany(x => x.Y)
.HasForeignKey(y => y.XId);
modelBuilder.Entity<X>()
.HasOptional(x => x.YOptional)
.WithOptionalDependent(y=> y.XOptional);
}
}
Run Code Online (Sandbox Code Playgroud)
您不能在两个实体之间建立关系,这两个实体的定义与两端不同.所以你不能从一个方向做1:*而从另一个方向做1:1.
让我猜一下,你真的不希望它从依赖端是1:1.从那一端起,它总是只指向一件事.
在映射中,与生活不同,除非你有多对多,否则孩子只有一个父母.
但是,您可以创建0..1:*relationaship(零或一对多).父母可以有一个或多个孩子(例如"很多"),但孩子可以在没有父母的情况下存在,但是父母可以永远不会有多个孩子(例如"零或一个").
这是使您的类产生[零或一个]到多个关系的最简单方法.请注意,我在类Y中使外键成为可以为null的int.通过此设置,EF约定将生成一个映射,使子节点不存在父节点.
public class X
{
[Key]
public int XId { get; set; }
public ICollection<Y> Y { get; set; }
}
public class Y
{
[Key]
public int YId { get; set; }
public int? XId { get; set; }
public X X { get; set; }
}
public class DataContext : DbContext
{
public DbSet<X> XSet { get; set; }
public DbSet<Y> YSet { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
以下是从上述类和上下文派生的可视化模型的屏幕截图.我认为这可以实现你所寻求的行为,如果我猜你可能只是以不同的方式感知它是正确的.

| 归档时间: |
|
| 查看次数: |
1804 次 |
| 最近记录: |