【发布时间】:2021-10-31 15:18:48
【问题描述】:
我正在制作一个 Web 应用程序,作为数据库提供商,我使用 postgresql 和 Ef Core 作为 ORM。我有两个班级:
public class Price
{
public int PriceId { get; set; }
public DateTime TimeStamp { get; set; }
public double Value { get; set; }
public int CompanyId { get; set; }
public virtual Company Company { get; set; }
}
public class Company
{
public Company()
{
Prices = new HashSet<Price>();
}
public int CompanyId { get; set; }
public string Acronym { get; set; }
public string FullName { get; set; }
public virtual ICollection<Price> Prices { get; set; }
}
我的问题是,每当我尝试为第一家公司添加一些记录时:
var company = Context.Companies.FirstOrDefault(c => c.CompanyId == 1);
company.Prices.Add(new Price {Value = 123.45, TimeStamp = DateTime.Now});
然后是另一个
var company = Context.Companies.FirstOrDefault(c => c.CompanyId == 2);
company.Prices.Add(new Price {Value = 123.45, TimeStamp = DateTime.Now});
代替:
CompanyId | PriceId | TimeStamp | Value
-------------------------------------------
1 | 1 | foo | bar
1 | 2 | foo | bar
2 | 1 | foo | bar
2 | 2 | foo | bar
我明白了:
CompanyId | PriceId | TimeStamp | Value
-------------------------------------------
1 | 1 | foo | bar
1 | 2 | foo | bar
2 | 3 | foo | bar
2 | 4 | foo | bar
我的 Pgadmin 4 配置:
【问题讨论】:
-
这是意料之中的。 ID 与公司没有任何关系,因此它们必须是全球唯一的。您是否有特定的原因希望它们与众不同?可以使用组合键或自定义逻辑,但通常不需要特定的 ID
-
我希望 CompanyId 和 PriceId 组成一个复合键。我不知道我是否设法做到了,所以我放置了配置的屏幕截图。我必须承认,这样的列举在清晰方面确实很有帮助。我想从外部 API 解析有关价格的信息,并避免所有 PriceId 不同的情况会非常好。我会避免使用难以阅读的大数字,并拥有漂亮、易于阅读、有意义的 PriceId。
-
此类考虑不应在数据建模中发挥作用。只有健全的规范化和适当的关系。
PriceId是所谓的代理键,它的值无关紧要。即使 Price 需要有一个 identifying relationship 到 Company,PriceId也不必为了可读性而在CompanyId内递增。实现这种模式也更加困难。 -
好的,我明白了。我必须承认,经过重新考虑,仅仅为了可读性而增加另一列听起来毫无意义。谢谢你的关系线程。我会读完所有的。感谢您宝贵的时间,先生们:)
标签: c# postgresql entity-framework