Linq-to-SQL 枚举支持
Linq-to-SQL 枚举支持。
我不太喜欢在代码中指定硬编码的值。这可能会变成调试噩梦,而且看起来也很糟糕。微软的 SQL Server OR-mapper linq-to-sql,我很喜欢它,但不幸的是,它没有内置的设计器支持从查找表生成 enum
,这之前导致我不得不进行我不喜欢的硬编码。好吧,不再了 - 请看。考虑以下示例数据库表
‘periodStatusId
’ 字段是我理想情况下希望填充的值...
myObject.periodStatusId = periodStatusIdEnum.OpenedStatus
...而不是...
myObject.periodStatusId = databaseContext.PeriodStatus.Single
( foo => foo.Description.Equals("Opened"));
好吧,有志者事竟成。我们可以做的是预定义一个 enum
并修改我们的数据库上下文以反映它。因此,在你的数据库层中,定义一个 enum
并从数据库复制它的值。就像这样
public enum PeriodStatusEnum
{
ClosedByUser = 1,
ClosedBySystem = 2,
ReOpenedByUser = 3
}
上面,整数对应于查找表的自动递增整数 ID,文本对应于描述字段。
嗯,不得不预定义枚举确实很糟糕。更希望能在设计器中完成,但 linq-to-sql 不支持。所以我们预定义它,至少知道这比硬编码风格要好几百倍。
现在 enum
已经创建,我们将引用它,而不是在数据上下文中引用数据库的本机类型。将查找表和引用表的字段类型更改为你的 enum
,并在前面加上 ‘global::
’ 值,即 global::yourNamespace(s).periodStatusEnum
。就像这样
就是这样 - 现在你可以使用你的枚举,而不是主动查找值。就像这样
TidsRegPeriode period = new TidsRegPeriode();
// populate field by referencing your enumeration
period.periodeStatusId = timeRegistrering.Domain.PeriodStatusEnum.ReOpenedByUser;
... other fields populated...
dbContext.TidsRegPeriodes.InsertOnSubmit(period);
dbContext.SubmitChanges();
再次说明,如果我们能在设计器中指定 enum
会好得多。但我们不能 - 所以这要好得多。