gpt4 book ai didi

c# - Entity Framework 与有时独立的类一对一

转载 作者:行者123 更新时间:2023-11-30 23:23:43 24 4
gpt4 key购买 nike

我有一个父类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.PdfFilejobFile.ComponentDesign

ComponentDesignJobFile 类型的每个属性都是可选的,JobFile 永远只属于一个ComponentDesign。但是,JobFile可能是独立的,不属于任何ComponentDesign(因此jobFile.ComponentDesign` 将为空)。

我正在为如何使用 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]) 的关系。

这可以通过以下方式实现,使用 .WithOptionalPrincipal Fluent API 中的方法。对于 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 注入(inject)这些配置类。只是 future 发展的一个想法。

如果您从 JobFile 端配置关系,您将使用 .WithOptionalDependent , 为了正确设置导航,而不是 .WithOptionalPrincipal .这完全取决于您从哪一侧配置关系。 ComponentDesign实体依赖于 JobFile实体比JobFile多了很多实体依赖于 ComponentDesign实体;因此它应该被配置为主体。

如上面评论之一所述,复杂的属性应该用 virtual 修饰。关键词。这个延迟加载属性,而且,当类被实例化时,它会将初始值设置为 null。 .

将数据库克隆到测试服务器,解决这个问题,然后在生产模型上实现更改;这样在迁移数据库时就不会丢失数据。

关于c# - Entity Framework 与有时独立的类一对一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38213561/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com