I don't much like it when I must specify hard-coded values into my code. It can be a debugging nightmare, furthermore it looks ghastly. Microsoft's SQL Server OR-mapper linq-to-sql, which I like very much, unfortunately does not have built-in designer support for generating enum
s from lookup-tables, which has previously found me doing that hard-coding I do not like to do. Well, no more - look on. Consider the examples database-tables:
The 'periodStatusId
' field is the one that I would ideally want to fill in as ...
myObject.periodStatusId = periodStatusIdEnum.OpenedStatus
... as opposed to ...
myObject.periodStatusId = databaseContext.PeriodStatus.Single
( foo => foo.Description.Equals("Opened"));
Well, there's a will and a way. What we can do is pre-define an enum
and alter our database-context to reflect it. So, in your database-layer, define an enum
and copy its values from the database. Like this:
public enum PeriodStatusEnum
{
ClosedByUser = 1,
ClosedBySystem = 2,
ReOpenedByUser = 3
}
Above, the integer corresponds to the auto-incrementing integer id of the lookup-table, the text corresponds to the description field.
It, well, it sucks, to have to pre-define the enumeration. Much preferred would be to do this in the designer, but that's not possible with linq-to-sql. So pre-define it we do, in the know that at least this will be a few hundred percent better than going hard-code style.
Now the enum
has been created, we'll refer to this instead of the database's native type in the datacontext. Change both the lookup-table's and the referencing table's field types to your enum
, pre-fixed with a 'global::
' value, i.e., global::yourNamespace(s).periodStatusEnum
. Like so:
That's it - now you can use your enumeration as opposed to actively looking up the value. Like this:
TidsRegPeriode period = new TidsRegPeriode();
period.periodeStatusId = timeRegistrering.Domain.PeriodStatusEnum.ReOpenedByUser;
... other fields populated...
dbContext.TidsRegPeriodes.InsertOnSubmit(period);
dbContext.SubmitChanges();
Again, it would be tremendously better if we could specify enum
s in the designer. But we can't - so this is a heck of a lot better.