Как изменить объекты linqtosql entityref в модели MVC с ручной кодировкой? - PullRequest
0 голосов
/ 25 февраля 2011

Я пытаюсь настроить свою собственную модель 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

1 Ответ

0 голосов
/ 25 марта 2011

Обновление: я никогда не получал этот кусок кода, чтобы работать надежно, поэтому я вернулся к тому, чтобы позволить Visual Studio генерировать DataContext с помощью графического дизайнера перетаскивания.

Я все еще немного борюсь с исправлением имен в ссылках отношений после обновления схемы БД (я тщательно называю все отношения в БД, но инструмент конструктора, кажется, игнорирует эти имена), но так как я обнаружил, что БД. Файл designer.cs можно открыть в редакторе xml, а не с помощью графического интерфейса, работа стала намного проще.

...