Объекты базы данных Modelbinding в ASPNET MVC

Вы можете позвонить FlushViewOfFile, который инициирует грязную запись страницы, а затем FlushFileBuffers, который согласно этой статье , гарантирует, что страницы были написаны.

Вызов FlushFileBuffers после каждой записи может быть «безопаснее», но это не рекомендуется. Вы должны знать, сколько потерь вы можете терпеть. Существуют шаблоны, которые ограничивают эту потенциальную потерю, и даже лучшие базы данных могут потерпеть неудачу при записи. Вам просто нужно вернуться к жизни с наименьшей возможной потерей , которая обычно требует некоторой регистрации с многофазной фиксацией.

Я полагаю, что можно открыть файл отображения памяти с помощью FILE_FLAG_NO_BUFFERING и FILE_FLAG_WRITE_THROUGH, но это высосет вашу пропускную способность. Я не делаю этого Я открываю отображенные в память файлы для асинхронного ввода-вывода, позволяя ОС оптимизировать пропускную способность за счет собственной реализации портов завершения асинхронного ввода-вывода. Это самая быстрая пропускная способность. Я могу терпеть потенциальную потерю, и смягчил соответственно. Мои отображенные в память данные представляют собой данные резервного копирования файлов ... и, если я обнаружу потерю, я смогу обнаружить и повторно создать резервную копию потерянных данных после устранения аппаратной ошибки.

Очевидно, что файловая система должна быть достаточно надежной, чтобы работать с приложением базы данных, но я не знаю ни одного поставщика, который бы предлагал вам резервное копирование. Плохие вещи произойдут . План потери. Единственное, что я делаю, - это то, что я никогда не пишу в середину данных. Мои данные являются неизменяемыми и версионными, и каждый файл «данных» ограничен 2 ГБ, но каждое приложение использует разные стратегии.

5
задан Luke Smith 5 February 2009 в 00:34
поделиться

3 ответа

К сожалению, Вы не управляете конструкцией образцового редактора связей, таким образом, Вы не можете ввести реализацию репозитория.

Можно протянуться непосредственно в сервисный локатор, чтобы вытянуть в репозитории и выбрать объект:

public class ProductBinder : DefaultModelBinder
{
    protected override object CreateModel(ControllerContext controllerContext, 
        ModelBindingContext bindingContext, Type modelType)
    {
        if(modelType != typeof(Product))
            return null;

        var form = controllerContext.HttpContext.Request.Form;
        int id = Int32.Parse(form["Id"]);
        if(id == 0)
            return base.CreateModel(controllerContext, bindingContext, modelType);

        IProductRepository repository = ServiceLocator.Resolve<IProductRepository>();

        return repository.Fetch(id);                                    
    }       
}

Вы могли бы даже сделать эту работу для всех Ваших объектов, если можно использовать базовый класс или интерфейс, который предоставляет идентификатор класса.

Необходимо будет настроить это в Global.asax:

ModelBinders.Binders.Add(typeof(Product), new ProductBinder());

и затем можно сделать это:

public ActionResult Save([Bind] Product product)
{
    ....

    _repository.Save(product);
}
2
ответ дан 14 December 2019 в 19:28
поделиться

Я получаю объект модели от базы данных, затем использую UpdateModel (или TryUpdateModel) на объекте обновить значения от параметров формы.

public ActionResult Update( int id )
{
     DataContext dc = new DataContext();
     MyModel model = dc.MyModels.Where( m => m.ID == id ).SingleOrDefault();

     string[] whitelist = new string[] { "Name", "Property1", "Property2" };

     if (!TryUpdateModel( model, whitelist )) {
        ... model error handling...
        return View("Edit");
     }

     ViewData.Model = model;

     return View("Show");
}
4
ответ дан 14 December 2019 в 19:28
поделиться

Вы не должны на самом деле поражать базу данных. Просто установки идентификатора объектов будет достаточно, чтобы настроить отношения, но наблюдать Ваши каскады. Удостоверьтесь, что Ваши cascde настройки не обновят связанный объект, поскольку он очистит значения.

-1
ответ дан 14 December 2019 в 19:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: