Re enum edit (добавлено в качестве второго ответа для простоты) ...
Во-первых, существует ли прямое отображение 1: 1 между перечислением и значениями? Например, если Basic равен 7, а Administrator равен 12, то:
enum AccessLevels
{
Basic = 7,
Administrator = 12
}
Затем измените тип этого свойства в dbml (через конструктор) с int на ваше (полностью квалифицированное) перечисление: Entities.AccessLevel
. LINQ-to-SQL поддерживает перечисления как прямые целочисленные, так и прямые строковые сопоставления.
Если это невозможно (более сложные сценарии), вы можете изолировать модели хранения (int) и объектно-ориентированные (enum); переименуйте свойство в AccessLevelStorage
(или что-нибудь еще, что вам нравится), и в частичном классе сделайте отображение:
partial class User {
public AccessLevel AccessLevel {
get {
switch(AccessLevelStorage) {
case 1: return AccessLevelStorage.Foo;
... etc
default: ...throw an exception?
}
}
set {
switch(value) {
case AccessLevel.Foo: AccessLevelStorage = 1; break;
...etc
default: ...throw an exception?
}
}
}
Единственное предостережение здесь заключается в том, что запросы LINQ будут работать только со свойствами storage , а не со свойством сопоставленного пользователя. Если вы выполняете свои запросы на уровне, который объявляет контекст, вы можете изменить доступ к свойству хранилища на internal
- но если вы делаете запросы вне этой сборки, вам нужно будет оставить это открытым Возможно, вы захотите добавить [Browsable(false)]
, чтобы он не появлялся в моделях пользовательского интерфейса, но это все.