如何处理没有其他关系的实体中的嵌套对象

Posted

技术标签:

【中文标题】如何处理没有其他关系的实体中的嵌套对象【英文标题】:How to handle nested object in Entities that have no other relation 【发布时间】:2021-10-18 13:03:09 【问题描述】:

考虑以下类:

public class Country
   public string Name get;set;
   public Coordinate Coordinate get;set;

public class Coordinate
   public Latitude get;set;
   public Longitude get;set;

现在,当我创建迁移时,它会创建两个表:CountryCoordinate,并在两个表之间进行映射。

Table: Country
[id, name, coordinateId]

Table: Coordinate
[id, latitude, longitude]

这感觉很阴暗,因为坐标与其他任何东西都没有关系。它也可以存储在同一个表中。

我觉得更好的方法是使用 1 张表 [Country] 包含所有字段:

Table: Country
[id, name, coordinate_latitude, coordinate_longitude]

在 EF 中是否可以接受有很多嵌套对象的表,其中填充了仅由其主要父对象使用的数据?或者有没有一种更有效的“扁平化”对象的方法?

【问题讨论】:

你使用什么 EFCore? @DmitriBodiu 3.1.20 看看我的回答,应该可以的 【参考方案1】:

https://docs.microsoft.com/en-us/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/implement-value-objects

有一个示例如何将值对象设置为主表中的列:

orderConfiguration.OwnsOne(p => p.Address) .Property(p=>p.Street).HasColumnName("ShippingStreet");

orderConfiguration.OwnsOne(p => p.Address) .Property(p=>p.City).HasColumnName("ShippingCity");

【讨论】:

谢谢,这行得通。所以谷歌的术语是“拥有的实体”。【参考方案2】:

为什么不使用SqlGeography

public class Country
   public string Name get;set;
   public SqlGeography Coords get;set;

否则,无论如何你都可以扁平化课程。

public class Country
   public string Name get;set;
   public double Latitude get;set;
   public double Longitude get;set;

【讨论】:

坐标是嵌套对象的示例。它不一定是坐标。 好吧,这让我很困惑。所以@DmitriBodiu 的答案是最好的。

以上是关于如何处理没有其他关系的实体中的嵌套对象的主要内容,如果未能解决你的问题,请参考以下文章

如何处理大型嵌套对象的缓存

如何处理一对多关系中的嵌套 mongoose 查询和异步问题?

如何处理 Redux 中的关系数据?

EF7 如何处理嵌套实体的更新操作

Swift 3 / 如何处理嵌套的 NSDictionaries,因为“Any 类型的值没有成员值”

如何处理 GraphQL 中的嵌套输入