Я пытаюсь настроить свою собственную модель mvc вместо того, чтобы позволить среде создавать ее с помощью инструмента графического дизайнера.Я надеялся, что это облегчит сохранение отдельных репозиториев для частей модельного пространства, но до сих пор это не вызывало у меня ничего, кроме горя.
Первая проблема, с которой я столкнулся, заключалась в том, что классы entityref должны были обновляться через элемент управления selectlist в представлении.Мне удалось заставить это работать, добавив поле с внутренним идентификатором к каждой сущности так же, как это делал бы файл designer.cs.Однако это сделало класс модели немного более сложным, как показывает код, приведенный ниже.
К сожалению, сейчас я столкнулся с проблемой, когда хочу явно обновить некоторые объекты в контроллере.Если я вручную устанавливаю поле идентификатора, обновление просто удаляется, если я изменяю сущность, я получаю исключение при сохранении.
Моя модель
[Table(Name = "dbo.Jobs")]
public class Job {
[Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)]
public int JobID { get; set; }
internal string _CompanyID; // string for legacy reasons
[Column(Storage = "_CompanyID")]
public string CompanyID{
get { return _CompanyID}
set {
if ((_CompanyID != value)) {
if (_MittlerOrg.HasLoadedOrAssignedValue) {
throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
}
_CompanyID = value;
}
}
}
internal EntityRef<Company> _Company;
[Association(Storage = "_Company", ThisKey = "CompanyID", OtherKey = "CompanyID", IsForeignKey = true)]
public Company Company {
get { return _Company.Entity; }
set {
Organization previousValue = this._Company.Entity;
if ((previousValue != value) || (_Company.HasLoadedOrAssignedValue == false)) {
if ((previousValue != null)) {
_Company.Entity = null;
}
_Company.Entity = value;
if (value != null) {
_CompanyID = value.OrganizationID;
} else {
_CompanyID = default(string);
}
}
}
}
// The contact depends on the choice of company and should be set
// inside an action method once the company is determined.
internal string _ContactID;
[Column(Storage = "_ContactID")]
public string ContactID {
get { return _ContactID; }
set {
if ((_ContactID != value)) {
if (_Contact.HasLoadedOrAssignedValue) {
throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
}
_ContactID = value;
}
}
}
internal EntityRef<User> _Contact;
[Association(Storage = "_Contact", ThisKey = "ContactID", OtherKey = "UserID", IsForeignKey = true)]
public User Contact {
get { return _Contact.Entity; }
set {
User previousValue = this._Contact.Entity;
if ((previousValue != value) || (_Contact.HasLoadedOrAssignedValue == false)) {
if ((previousValue != null)) {
_Contact.Entity = null;
}
_Contact.Entity = value;
if (value != null) {
_ContactID = value.UserID;
} else {
_ContactID = default(string);
}
}
}
}
}
Здесь есть функция редактирования, которая вызывает проблемы.Если я сделаю это в отладчике, то увижу, что fi.ContactID обновляется, но не фиксируется в БД.
[HttpPost]
public ActionResult Edit(int id, FormCollection collection) {
var user = userrep.FetchByLogin(User.Identity.Name);
var job = jobrep.FetchByID(id);
try {
var oldvalue = job.CompanyID;
UpdateModel(job, "job");
if (oldvalue != job.CompanyID) {
if (job.CompanyID != null) {
job.ContactID = orgrep.FetchByID(job.CompanyID).DefaultContactID;
} else {
job.ContactID = default(string);
}
}
firep.Save();
return RedirectToAction("Index");
} catch (Exception e) {
}
}
Есть идеи, как заставить эти надоедливые сущности вести себя?Я искал вверх и вниз по Интернету, но все примеры слоя модели, кажется, охватывают только самые простые отношения.Должен ли я просто изменить модель в пользу управления ссылками вручную через поля идентификатора.
Cheers, Duffy