У меня есть поле состояния для класса, который имеет идентификатор и имя.Я не использую enum для его моделирования, а скорее класс с некоторыми статическими значениями, например:
public class MailoutStatus : IEntity
{
public static MailoutStatus Draft = new MailoutStatus() { Id = 1, Name = "Draft" };
public static MailoutStatus Scheduled = new MailoutStatus() { Id = 2, Name = "Scheduled" };
public static MailoutStatus Cancelled = new MailoutStatus() { Id = 3, Name = "Cancelled" };
public static MailoutStatus Sent = new MailoutStatus() { Id = 4, Name = "Sent" };
public int Id { get; set; }
public string Name { get; set; }
...
}
Теперь я хочу установить это значение состояния для описываемого объекта, например, так:
var repo = new MailoutRepository();
var mailout = repo.Get(1);
mailout.Status = MailoutStatus.Cancelled;
repo.Update(mailout);
repo.CommitChanges();
Однако этот код будет видеть MailoutStatus.Cancelled как новый объект и вставит новую строку в таблицу MailoutStatus, игнорируя идентификатор, который уже включен, и добавив новый идентификатор, созданный IDENTITY (например,5).Я могу предотвратить это, добавив объект проверки сущности, но это только приводит к тому, что вышеперечисленное взрывается из-за ошибки проверки.
Я могу обойти проблему, используя этот код:
var repo = new MailoutRepository();
var mailout = repo.Get(1);
mailout.Status = new MailoutStatusRepository().Get(MailoutStatus.Cancelled.Id);
repo.Update(mailout);
repo.CommitChanges();
Этоработает, потому что теперь Entity Framework знает о MailoutStatus, который я извлекаю, и отслеживает его состояние и т. д. Но действительно глупо писать столько кода просто для установки статуса.Я также не хочу использовать enum по другим причинам, и я не хочу, чтобы MailoutStatus что-то знал о постоянстве.Есть идеи?