gpt4 book ai didi

c# - 如何对表和 View 使用相同的 DTO 外键关系

转载 作者:太空宇宙 更新时间:2023-11-03 22:49:26 27 4
gpt4 key购买 nike

我正在使用 ORMLite,我在发票 DTO 和发票行 DTO 之间定义了一个外键关系:

public interface IDto<PKType> where PKType : struct
{
[Required(ErrorMessage = "Id is required")]
PKType Id { get; set; }
}

[Ss.Alias("Invoices")]
public class InvoiceDto : AuditedDto, IAuditedDto, IDto<Guid>
{
[Required]
public Guid VendorId { get; set; }

[Ss.Reference]
public List<InvoiceLineDto> InvoiceLines { get; set; }
}

[Ss.Alias("InvoiceLines")]
public class InvoiceLineDto : AuditedDto, IAuditedDto, IDto<Guid>
{
[Required]
public string Item { get; set; }

[Required]
public int Qty { get; set; }

[Required]
public decimal UnitPrice { get; set; }

[Ss.ForeignKey(typeof(InvoiceDto))]
public Guid InvoiceId { get; set; }
}

现在我已经在我的发票中定义了一个 View ,它返回相同的数据但包括发票状态:

[Ss.Alias("InvoiceStatus")]    
public class InvoiceStatusDto : InvoiceDto
{
public int Status { get; set; }
}

但是当我查询 InvoiceStatus View 时,会出现 System.ArgumentException: Cant find 'InvoiceStatusId' Property on Type 'InvoiceLineDto'。我不确定如何解决复制 InvoiceLineDto 来专门定义外键关系的问题。有没有办法使用代码而不是注释来处理这种情况?

最佳答案

OrmLite foreign keyreferences attributes relies on naming conventions .问题是 InvoiceLines 表维护了 Invoices 表而不是 InvoiceStatus 表的外键。

您试图在您的数据模型中过度使用继承可能是为了追求 DRY,这是一种损害。 OrmLite 的 POCO 数据模型应该 1:1 映射到 RDBMS 表,多级继承的使用表明情况并非如此,或者如果它是底层 RDBMS,则表有不必要的爆炸。

虽然在不引起耦合冲突的情况下干燥您的实现逻辑应该是一个目标,但这不适用于您的 POCO 或架构定义...

通过滥用继承来隐藏属性

Hiding properties isn't duplicating code ,它使意图明确。属性是声明性的,隐藏它们只会让您的代码更难阅读和推理,这需要打开多个源文件,给阅读您的代码的开发人员带来负担,并通过强制他们合并和构建模式来增加他们所需的认知负担从他们头脑中的多个源文件,而不是他们能够查看一个源文件,其中明确列出了表的所有属性。

数据模型中的多级继承是对继承的滥用,我怀疑这是造成紧耦合问题和糟糕的 RDBMS 设计的原因。我看不出您如何需要一个完全独立的 InvoiceStatus 表,而不是维护一个包含 Status 字段的 Invoice 表。

您的表结构的其他问题是 Dto 后缀,它表示这些是 DTO 而不是数据模型。虽然它是 perfectly reasonable to reuse OrmLite's Data Model classes as DTOs Dto 后缀表明您正在维护与数据模型分开的单独的特定于目的的 DTO 类(即用于序列化)。但此示例将 [ForeignKey] 属性添加到 DTO 类,而不是将它们添加到数据模型类中。

另一个命名问题是您的一些 RDBMS 表使用不一致的复数命名约定,[Ss.Alias("InvoiceLines")] 是复数,而 [Ss.Alias("InvoiceStatus ")] 不是。

关于c# - 如何对表和 View 使用相同的 DTO 外键关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48141244/

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