我想找出一个难题。我正在使用一个系统,在该系统中,数据库中保存了许多公司记录。这些记录中有一些是重复的,不再需要/不需要。但是,几个外部系统仍在映射到这些无效的记录。如果我们要完全删除它们,则将导致仍然希望获取该公司详细信息的系统出错。我想要的理想工作流程是:
外部系统查找公司IDX。
当前系统有一个表,其中包含所有重新映射的记录的记录,因此当请求进入时,该表指定将公司ID X重定向到公司IDY。
有许多端点可以一个接一个地更改以完成此操作-但是这很耗时,而且还会导致很多重复。
我的问题是,使用Entity Framework和.Net-是否有实现此工作流程的明智方法?
我最初的想法是对公司对象的构造函数做一些事情,如果存在“重定向”,它将从EF重新填充该对象,但是我不知道这对导航属性是否会起到很好的作用。有人有主意吗?
非常感谢。
您可以为同一张表创建带有外键的列,以表示单个唯一有效的公司。
例如,您可以添加DuplicateOf
列:
ALTER TABLE [Company]
ADD COLUMN [DuplicateOf] bigint NULL,
FOREIGN KEY [DuplicateOf] REFERENCES [Company] ([Id]);
并在您的代码中表达这种关系:
public class Company
{
// ...
public Company DuplicateOf { get; set; }
// May be useful, hides check for duplicate logic:
public bool IsDuplicate => DuplicateOf != null;
// May be useful as well,
// returns the non-duplicate uniue company, not a duplicate, either linked or current:
public Company EffectiveCompany => DuplicateOf ?? this;
}
EffectiveCompany
当您要使用非重复项时,必须寻址,并维护此列以始终指向正确的记录。如果已加载,也会导致其他查询。
另一个想法是拥有一个存储过程 GetCompany(bigint id)
,该存储过程将返回有效记录(如果DuplicateOf
存在),否则返回自身记录。这将对您的外部系统有益,并将使您将所有这些东西隐藏在存储过程的抽象层后面。如果您决定将来进行更改,则可以轻松更新它而不会破坏外部系统。
但是,对于您来说,使用带有EF的存储过程并不总是很方便。
无论如何,这些只是想法,而不是最佳解决方案。
在我看来,最好的解决方案是摆脱重复,到处更新数据,并永远忘记这些重复数据。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句