跨多个实体同步ID

时间:2012-05-01 15:11:52

标签: c# .net entity-framework entity

我有一个运行的应用程序,其实体可能是:CustomerType1,CustomerType2和CustomerType3。

所有三个CustomerType实体可能具有完全不同的信息,但它们都具有一个整数的CustomerID字段。

我正在试图弄清楚如何设置,这样无论创建哪种类型,CustomerID在所有三种类型中始终是唯一的,并且保持整数。

例如,创建以下内容将导致以下CustomerID

CustomerType1 - 1

CustomerType1 - 2

CustomerType1 - 3

CustomerType2 - 4

CustomerType1 - 5

CustomerType3 - 6

CustomerType1 - 7

最好的方法是什么?

2 个答案:

答案 0 :(得分:0)

您的方法类似于在网络数据库中具有相同的实体类型,具有唯一ID。

通常,许多开发人员使用UID或相关类型。它是一种具有64位,128位或更多位数的类型,它是随机生成的。如果在不同的机器中使用相同的数据库,则获得相同的值几乎是不可能的。

某些数据库将该值存储为字符串,而不是整数。

如果您只有一个包含整数键的表,那么如何生成主键值?自动?您是否在代码中生成了值,后来又分配给了主键字段?

解决方案1 ​​

如果您的数据库支持U.I.D.或O.I.D.或作为整数自动生成的唯一标识符,使用它们。

解决方案2

如果您的数据库支持U.I.D.或O.I.D.作为varchar / string,或者你使用的数据库引擎或程序,有一个生成UID的函数,你可以使用该函数,将结果值从string转换为整数,(剥离像“ - ”这样的分隔符),并存储在整数主键字段。

<强>摘要

许多开发人员喜欢在插入新记录时让数据库引擎自动生成主键。在这种情况下,喜欢这样,更好的是,在代码中生成主键,并直接分配它。由于您使用的是“实体框架”,因此我忽略了该库如何处理主键。

干杯。

答案 1 :(得分:0)

2种可能的方法:

  1. 对所有客户类型使用单个表,并使用“discriminator”字段跟踪每个客户类型,并将CustomerID作为其标识。
  2. 使用外部表管理将CustomerID创建为标识字段。
  3. 第一种方法的优点是可以在实体框架中获得直接支持,如下面的教程所述:

    http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-inheritance-with-the-entity-framework-in-an-asp-net-mvc-application

    请注意,虽然您的客户类型可能包含不同的数据,但从长远来看,尽管浪费了数据库空间,但这种方法最终可能会更便宜。在您的业务层中,客户类型可以简单地忽略与它们无关的字段。

    第二种方法可能最适合添加到难以更改的现有应用程序。从长远来看,通过这种方式跟踪ID会涉及更多工作。例如,您的业务层将需要从一个表中获取ID以便插入到另一个表中,这对于大型数据集来说可能是昂贵的。根据业务层的要求,可能还有一些情况需要丢弃未使用的CustomerID,而系统中根本不存在(例如,您可以从CustomerID 58跳到CustomerID 60)。