На самом деле, я думаю, что есть другое решение.
То, что мы недавно делали в нашем Проекте, использовало методы расширения.
Я написал два из них, один для Enum и один длясущность, но вот пример:
namespace Foo.Enums
{
[DataContract]
public enum EAccountStatus
{
[DataMember]
Online,
[DataMember]
Offline,
[DataMember]
Pending
}
... само перечисление, а теперь методы расширения, содержащие статический класс:
public static class AccountStatusExtensionMethods
{
/// <summary>
/// Returns the Type as enumeration for the db entity
/// </summary>
/// <param name="entity">Entity for which to check the type</param>
/// <returns>enum that represents the type</returns>
public static EAccountStatus GetAccountStatus(this Account entity)
{
if (entity.AccountStatus.Equals(EAccountStatus.Offline))
{
return EAccountStatus.Offline;
}
else if (entity.AccountStatus.Equals(EAccountStatus.Online))
{
return EAccountStatus.Online;
}
else if (entity.AccountStatus.Equals(EAccountStatus.Pending))
{
return EAccountStatus.Pending;
}
throw new System.Data.Entity.Validation.DbEntityValidationException(
"Unrecognized AccountStatus was set, this is FATAL!");
}
... метод расширения длятип сущности и удобный метод для более короткой типизации:
/// <summary>
/// Gets the String representation for this enums choosen
/// </summary>
/// <param name="e">Instance of the enum chosen</param>
/// <returns>Name of the chosen enum in String representation</returns>
public static String GetName(this EAccountStatus e)
{
return Enum.GetName(typeof(EAccountStatus), e);
}
}
}
... и, наконец, использование:
// to set always the same, mappable strings:
db.AccountSet.Single(m => m.Id == 1).Status = EAccountStatus.Online.GetName();
// to get the enum from the actual Entity you see:
EAccountStatus actualStatus = db.AccountSet.Single(m => m.Id == 1).GetAccountStatus();
Теперь вам просто нужно "использовать Foo.Enums;"и вы можете вызывать методы как для объекта, так и для перечисления.И, что еще лучше, в некоторых видах оберток для ваших сущностей вы также можете выполнять плавное распределение между разными типами, представляющими одно и то же в больших проектах.
Единственное, на что стоит обратить внимание, это то, что вам иногда приходится выполнять метод расширения, прежде чем передать выражение Linq в Linq.Проблема в том, что Linq не может выполнить метод расширения в своем собственном контексте ...
Может быть, просто альтернатива, но мы сделали это так, потому что это дает вам большую гибкость в том, как получить вещидля юридических лиц.Вы можете легко написать расширение, чтобы получать учетные записи актуальных продуктов в ShoppingCart ...
Greetings, Kjellski