[英]Entity Framework 1 to 0 or 1 relationship configuration
我有这门课
public class Parent
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public virtual Child Child { get; set; }
}
和一个儿童班
public class Child
{
[Key]
[ForeignKey]
public int ParentId { get; set; }
public string Name { get; set; }
public virtual Parent Parent { get; set; }
}
这种关系使父母可以有0或1个孩子。 我检查了SO并找到了两个解决方案。
modelBuilder.Configurations.Add(new ParentChildMap());
// solution 1
class ParentChildMap : EntityTypeConfiguration<Child>
{
public ParentChildMap()
{
HasRequired(t => t.Parent).
WithRequiredDependent(t => t.Child);
}
}
// solution 2
class ParentChildMap : EntityTypeConfiguration<Child>
{
public ParentChildMap()
{
HasOptional(c => c.Parent)
.WithRequired(c => c.Child);
}
}
事实是,他们都在工作 ! 但问题是, 我不确定哪一个是正确的。 哪一个给我一个父母只能有0或1个孩子的映射。 那么,另一个人说的是什么?
让我们将相关实体添加到所需的关系及其基数:
父1 < - > 0..1孩子
你可以这样读它:
(1) - > 0..1 Child表示每个Parent可以有0或1个Child,换句话说, Parent
实体的Child
属性是可选的
(2) 父1 < -表示每个子节点总是有1个父节点,换句话说, 需要 Child
实体的Parent
属性。
与Child
方面相对应的流畅配置是:
HasRequired(c => c.Parent).WithOptional(p => p.Child);
或者从Parent
方那里:
HasOptional(p => p.Child).WithRequired(c => c.Parent);
这两个是正确的并完全等效 - 您可以使用一个或另一个,具体取决于您是从Child
(如样本)还是从Parent
启动配置。 为了避免差异,不要两者都做。
为什么您当前的解决方案都不正确?
因为:
(解决方案1)
HasRequired(t => t.Parent).WithRequiredDependent(t => t.Child);
表示父1 < - > 1子关系(父亲必须始终有1个孩子)。
(解决方案2)
HasOptional(c => c.Parent).WithRequired(c => c.Child);
代表父0..1 < - > 1子关系(孩子可以有0或1个父母,父母必须总是1个孩子),即与你想要的相反。
事实是,他们都在工作! 但问题是,我不确定哪一个是正确的?
是! 你的两种方法都是不正确的(信用转到Ivan Stoev)。 因为:
你的解决方案1:
HasRequired(t => t.Parent).WithRequiredDependent(t => t.Child);
表示父1 < - > 1子关系(父亲必须始终有1个孩子)。
你的解决方案2:
HasOptional(c => c.Parent).WithRequired(c => c.Child);
代表父0..1 < - > 1子关系(孩子可以有0或1个父母,父母必须总是1个孩子),即与你想要的相反。
您的Fluent API应如下所示:
modelBuilder.Entity<Parent>()
.HasOptional(p => p.Child) // Mark Child property optional in Parent entity
.WithRequired(c => c.Parent); // mark Parent property as required in Child entity. Cannot save Child without Parent
此外,您还可以使用Data Annotation配置One-to-One或One-to-Zero关系,如下所示:
子类应如下:
public class Child
{
[Key,ForeignKey("Parent")]
public int ParentId { get; set; }
public string Name { get; set; }
public virtual Parent Parent { get; set; }
}
你不需要修饰ForeignKey
属性。 如果你想要一个1到0的关系,关系的一边必须是可选的(例如:HasOptional),如下面的代码:
public class Parent
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public virtual Child Child { get; set; }
}
public class Child
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public virtual Parent Parent { get; set; }
}
public class ParentMap : EntityTypeConfiguration<Parent>
{
public ParentMap ()
{
HasOptional(t => t.Child).WithRequired(t => t.Parent);
}
}
现在,当您向数据库添加新父项时,不需要添加子项,因为它是可选项,但是当您要将新子项添加到数据库时,子项Id
必须与父项Id
相等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.