65.9K
CodeProject 正在变化。 阅读更多。
Home

Linq-to-SQL 枚举支持

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2014年2月11日

CPOL

1分钟阅读

viewsIcon

17622

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 会好得多。但我们不能 - 所以这要好得多。

© . All rights reserved.