我有一个父类ComponentDesign
:
public class ComponentDesign
{
public string Name { get; set; }
public virtual JobFile DesignFile { get; set; }
public int? DesignFileId { get; set; }
public Pdf PdfFile { get; set; }
public int? PdfFileId { get; set; }
public JobFile SealedPdfFile { get; set; }
public int? SealedPdfFileId { get; set; }
public int Id { get; set; }
public int JobId { get; set; }
}
子类
JobFile
(其中Pdf
是子类):public class JobFile
{
public int ID { get; set; }
public string Name { get; set; }
public string Url { get; set; }
public ComponentDesign ComponentDesign { get; set; }
public int? ComponentDesignId { get; set; }
public int? JobId { get; set; }
}
这些类使用Entity Framework存储在关系数据库中。我想在关系的两边都具有导航属性,以便可以随意说
componentDesign.PdfFile
或jobFile.ComponentDesign
。JobFile
中ComponentDesign
类型的每个属性都是可选的,并且JobFile will only ever belong to one
ComponentDesign . However, a
JobFile may be free-standing, not belonging to any
ComponentDesign (so
jobFile.ComponentDesign`为null)。我正在努力使用Fluent API配置这种关系。这是一对一的。关系的两边是否都可以具有导航属性?请记住,
JobFile
可以是独立的(因此jobFile.ComponentDesign
并不总是相关的),因此有JobFile
个属于ComponentDesign
,一些不属于。我觉得最接近的是:modelBuilder.Entity<ComponentDesign>()
.HasOptional(componentDesign => componentDesign.DesignFile)
.WithRequired(jobFile => jobFile.ComponentDesign);
但这在我看来表明
jobFile.ComponentDesign
始终是必需的,事实并非如此。我很想尝试一下,因为它会产生一些实质性的迁移,因此我想先获得意见。在这种情况下,我的Fluent API配置应该是什么样的? 最佳答案
为了使我理解这些关系:ComponentDesign
-> JobFile
=可选。JobFile
-> ComponentDesign
=可选。
这是零或一到零或一([0/1]-[0/1])关系。
使用fluent API中的.WithOptionalPrincipal
方法,可以通过以下方式实现此目的。有了1-0的关系,很明显哪个端是主要端;与1-∞关系相同。 ∞-∞关系没有主要终点,这是因为创建了隐藏表来控制它们之间的关系。对于0 / 1-0 / 1或1-1关系,这并不明显,因此您必须告诉数据库将哪个端用作关系的主要端。除其他事项外,主要负责启动和维护表之间的关系。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Configure ComponentDesign & JobFile entity
modelBuilder.Entity<ComponentDesign>()
// Mark JobFile property optional in ComponentDesign entity.
.HasOptional(cd => cd.DesignFile)
// Mark ComponentDesign property optional in JobFile entity.
.WithOptionalPrincipal(jf => jf.ComponentDesign);
}
或者,如果要进行大量排序,则可以为每个实体创建一个
EntityTypeConfiguration<>
类以分离出关系。尽管这样做确实分散了关系,但是它具有更大的可伸缩性,因为一旦配置了上下文,就可以通过MEF注入这些配置类。只是未来发展的一个想法。如果要从JobFile端配置关系,则可以使用
.WithOptionalDependent
而不是.WithOptionalPrincipal
来正确设置导航。这完全取决于您从哪一侧配置关系。 ComponentDesign
实体对JobFile
实体的依赖程度远大于JobFile
实体对ComponentDesign
实体的依赖;因此应将其配置为主体。如上述评论之一所述,应使用
virtual
关键字修饰复杂的属性。延迟加载属性,并且当类被实例化时,它将初始值设置为null
。将数据库克隆到测试服务器,以解决这一问题,然后在生产模型上实施更改;这样,在迁移数据库时就不会丢失数据。
关于c# - Entity Framework 与有时是独立的类一对一,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38213561/