Подлипенский Павел

Блог о технологиях и деньгах

Entity Framework - Таблицы без первичного ключа

clock сентября 26, 2008 10:18 by author Подлипенский Павел

Один из моментов, который необходимо учесть при работе с Entity Framework - это как работать с таблицами без первичных ключей. По умолчанию сущность такой таблицы(proxy-класс) будет мэпится не к физической модели таблицы, а к так называемому Defining Query.Чтоб очень это мешало - так нет, но обновлять/изменять данные в этой таблице сразу после генерации класса вы не можете. Да и дизайнер не показывает, что это таблица только на посмотреть (и это не просто слова, а намек тем, кто этот дизайнер пишет). Поэтому вы получите ошибку времени выполнения Unable to update the EntitySet 'Events' because it has a DefiningQuery and no <DeleteFunction> element exists in the <ModificationFunctionMapping> element to support the current operation.

И это еще не все проблемы на которые вы можете тут наступить. Во время генерации вашего прокси-класса Entity Framework пометит все хорошие поля как часть Entity Key (откровенно говоря это все не nullable и не binary поля). Правда надо отдать должное EF - во время генерации прокси-класса из базы данных, вы можете видеть такое предупреждение: "The table/view 'DemoTable' does not have a primary key defined. The key has been inferred and the definition was created as a read-only table/view." Для починить это нужно добавить в поле вашей таблицы первичный ключ, а затем обновить модель из базы данных. После нужно будет ручками подправить ключевые поля в вашей сущности(Entity). Есть еще одна возможность обновлять данные в таблице без первичного ключа - промэпить хранимые процедуры на удаление и модификацию данных.

А вообще работы много, писать некогда, но все равно буду - хоть мало, так смачно.

Текущий рейтинг: 5.0 (4 голосов)

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Динамическое добавление ASP.NET пользовательского контрола с использованием JQuery

clock сентября 9, 2008 09:58 by author Подлипенский Павел

Недавно у меня возникла необходимость динамически подгружать пользовательские контролы на страницу. Это довольно просто реализовывается с помощью UpdatePanel. Но мне этот вариант не подошел, так как страница должна весить как можно меньше и работать как можно быстрее. Поэтому выбор пал именно на связку ASP.NET и JQuery + Web Service. Для начала давайте разберемся каким образом можно вызвать Web Method с помощью JQuery.

function getJsonAjaxObject(webServiceURL, jsonData) {
 $.ajax({
  type: "POST",
  contentType: "application/json; charset=utf-8",
  url: serviceURL,
  data: jsonData,
  success:
   function(msg){
   //код обработки успешного вызова веб-метода
   },
  error:
   function(XMLHttpRequest, textStatus, errorThrown){
    //код обработки ошибки выполнения веб-метода
   }
 });
}

Из всего множества методов (load, get, post, getJSON, ajax) я выбрал именно ajax т.к. этот метод позволяет наиболее полно контролировать процесс создания асинхронного запроса к веб-сервису.

Имя Тип Описание параметра
type string возможные варианты – GET или POST. Если параметр упущен, то по умолчанию будет использоваться метод GET. Типы запроса PUT или DELETE тоже могут быть использованы, но они поддерживаются не всеми браузерами.
contentType string при передаче данных серверу сообщает content-type. По умолчанию - application/x-www-form-urlencoded.
url string адрес веб-сервиса. Например, http://mysite.com/myservice.asmx/mywebmethod
data object данные, передаваемые на сервер. Добавляются в URL GET-запроса. Если используется объект, он должен представлять собой пары ключ/значение. Если значения представлены в виде массива, jQuery сериализует значения с некоторым ключом. Например: {foo:["bar1", "bar2"]} будет представлено как "&foo=bar1&foo=bar2".
success function указывается функция, которая будет вызвана в случае успешного завершения запроса. Функция принимает два аргумента: данные, возвращенные с сервера и отформатированные с учетом параметра dataType и строка, описывающая статус ответа(в нашем примере это строка всегда будет “success”).
error function определяет функцию, которая будет вызвана в случае неуспешного выполнения запроса.
dataType string строка, описывает тип данных, которые ожидаются в качестве ответа сервера. Если не определена, то jQuery сам попытается определить тип, основываясь на MIME-типе ответа сервера. Доступные типы: - xml: вернет XML документ, который может быть обработан через jQuery. - html: вернет HTML как plain text. - script: расценивает ответ как JavaScript и возвращает его как plain text. - json: расценивает ответ как данные в формате JSON и возвращает JavaScript объект. - jsonp: загружает данные в формате JSON используя JSONP. Необходимо дополнительно добавить "?callback=?" в конец строки запроса в URL, чтобы определить вызов. (Добавлено в jQuery 1.2). - text: строка plain text.
async boolean
по умолчанию все запросы выполняются в асинхронном режиме (значение true). Если необходимо выполнить синхронный запрос, следует установить значение false для этой опции. Помните, что синхронный запрос может временно заблокировать браузер, запретив любые действия во время выполнения запроса.
beforeSend function
может содержать функцию, которая должна быть вызвана до передачи запроса. beforeSend - это Ajax Event (события рассмотрены в другой статье).
cache boolean
опция добавлена в jQuery 1.2. По умолчанию - true. Если установить в false, запрашиваемая страница не будет кэшироваться браузером.
complete function
определяет функцию, которая будет вызвана по окончанию запроса (успешного и ошибочного выполнения). Принимает два аргумента: объект XMLHttpRequest и строку, описывающую "успешность" запроса. complete - это Ajax Event (события рассмотрены в другой статье).
global boolean
true или false. Вызывать или нет глобальные обработчики событий Ajax для этого запроса. Может быть использована для контроля различных Ajax событий. По умолчанию - true.
ifModified boolean
запрос будет успешным только в случае, если данные ответа изменились со времени последнего запроса. По умолчанию - false.
processData boolean
по умолчанию true. В опции data данные представлены в виде объекта, который преобразуется в строку запроса, подходящую для content-type по умолчанию - "application/x-www-form-urlencoded". Если необходимо иное, установите опцию processData в false.
timeout number
устанавливает локальный тайм-аут для запроса в миллисекундах. Отменяет глобальный тайм-аут для этого запроса, если тот определен через $.ajaxSetup


Необходимо также учесть, что ASP.NET Ajax enabled веб-сервис разрешает только HTTP POST (по умолчанию) для вызова метода, который возвращает JSON.

В большинстве случаев IIS 6 и выше требует наличия content-length элемента в запросе POST, даже если данных в запросе нет. Content-length для запроса без данных должен быть равен 0, но JQuery, в таком случае, этот элемент не добавляет. Поэтому для readonly запросов POST необходимо указывать пустой JSON объект:

data: “{}”

Это натолкнет JQuery на мысль указать корректный content-length и ваш веб-сервис сможет правильно распознать readonly-запрос, отбросив при этом пустой параметр.

Хочу еще обратить ваше внимание на то, что contentType установлен в "application/json;charset=utf-8". Этого требует ASP.NET AJAX. JSON-запросы, не имеющие подобного заголовка будут проигнорированы ASP.NET.

Еще одна проблема, с которой мне пришлось столкнуться, это “Maximum length exceed” ошибка. Она возникает в случае, когда длина JSON-ответа превышает длину по умолчанию. Во избежание этой ошибки необходимо добавить в web.config следующее:

<system.web.extensions>
  <scripting>
     <webServices>
    <jsonSerialization maxJsonLength="5000000" />
     </webServices>
  </scripting>
</system.web.extensions>

Вот так выглядит код моей страницы

<%@ Page Language="C#" EnableViewState="false"  %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="head" runat="server">
    <title>Add ASP.NET User Control dynamically with JQuery</title>
    <script language="javascript" type="text/javascript"   src="Scripts/jquery-1.2.6.pack.js"></script>
    <style type="text/css">
        body
        {
            width:95%;
            padding-left:20px;
            font-family:Arial;
            font-size:10pt;
            padding-right:20px;
        }
    </style>
</head>
<body>
    <form id="form" runat="server">
        <input type="button" value="Load GridView" onclick="getData('ScriptService.asmx/GetControlHtml','~/Controls/GridView.ascx');" />
        <input type="button" value="Load Login Control" onclick="getData('ScriptService.asmx/GetControlHtml','~/Controls/LoginControl.ascx');" />
 <div id="testDiv"></div>
    </form>
<script type="text/javascript">
…     
</script>
</body>
</html>

JavaScript для вызова веб-метода и динамического добавления пользовательского контрола на страницу

function getData(serviceURL, controlLocation) {
 $.ajax({
  type: "POST",
  contentType: "application/json; charset=utf-8",
  dataType: "json",
  url: serviceURL,
  data: "{'controlLocation':'" + controlLocation + "'}",
  success:
   function(msg){
     $('#testDiv').html(msg.d);
   },
  error:
   function(XMLHttpRequest, textStatus, errorThrown){
       alert( "Error Occured!" );
   }
 });
}

Для товарищей, малознакомых с JQuery (к коим отношусь пока и я), хочу объяснить следующую строку javascript-кода

$('#testDiv').html(msg.d);

Собственно в этой строке и происходит все чудо, а именно нам возвращается некий JSON-объект (msg), содержащий в себе строку. Часть строки $(‘#testDiv’) вернет нам набор объектов с id=’testDiv’ (в нашем случае это будет один div), далее мы вызываем метод html, который превратит нашу строку в дерево объектов и поместит его в коллекцию дочерних элементов нашего div’a. Эту операцию можно было записать несколько иначе:

$("#someElement")[0].innerHTML = msg.d;

Возможно, такая запись для кого-то будет понятней.

Данный пример доступен для скачивания. Исходные коды на C#.

Текущий рейтинг: 5.0 (5 голосов)

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Search


LinkedIn Profile

Tags

Posts

  • Я уже закончил универ. И очень жаль что в основном там было только теория. Я был бы щастлив, и достиг бы уже намного большего, будь там практический опыт о котором Вы пишете.
    Юра

  • К вышеозначенным преподавателям я бы еще добавил Шевченко с кафедры ИСПР. А так - да, спасибо Бондареву за отряд программистов и Вечуру за олимпиады. Было весело :)
    Dmytro Shteflyuk

  • Не стоит забывать про обще-образовательные предметы, составляющие 60% на любой "современной ИТ специальности". А вдруг они кому-то интересны? (я в это не верю.) В обратном случае, в ХПИ например человек 50-100-200 преподавателей станут как бы "не востребованы" и потеряют работу. Помоему это одна из основных причин, по которым никакой современный вуз в Украине не станет применять инноваций в построении процесса обучения. ЗЫ: Моё личное мнение, что обучение на ит-специальности в вузе - это на 90% пустая трата времени забивание головы ненужным хламом. Мне идеальный процесс обучения видится так: некоторый спектр обязательных (по специальности) предметов + некоторое кол-во предметов на выбор для каждого студента, на каждый семестр. ВУЗам будет труднее планировать нагрузку на преподавателей, но студентам станет в ЭНН раз лучше и интереснее ходить на пары - появится стимул.
    mormat

  • да мы тут все учились в одном ВУЗе? ну тогда для начала -- долгие лета ХНУРЭ! а теперь о грустном, к сожалению в мое время одним из "лучших" преподавателе считался некто Марченко. и это персонаж читал у нас крус С/С++, все, что мы знали о "плюсах", мы выучили исключительно вопреки его следованию букве конспектов экс-супруги. таже история была с "вышкой" и "теорвером". разбаллансированная программа, в которой 10% специальных предметов, откровенный саботаж со стороны преподавательского состава в области курса реалиционных баз данных и системного анализа. итого, 5% предметов. Виктор Иванович прав во многом, но к сожалению система высшего образования дискредитирует себя сама. и в первую очредь тем, что "старая гвардия" в 80% случае безнадежно отстала от объективной реальности, а новая -- это часто люди, которые не способны ни на что бОльшее, чем подхалимаж и лизоблюдство. [b]единственный[/b] из моих однокурсников, кто остался преподавать, был человеком, замеченным в откровенном мошенничестве и двурушничистве. Бондарев... не имею, наверное, права судить человека вдвое старше себя, который создал отряд "Программист" и дал путевку в жизнь многим. но тот факт, что мне было выставлено "отлично" за тесное знакомство с некой леди, которая имела вес в отряде -- это объективный факт. но это еще один камушек в огрод дискредитации высшего образования. а есть еще коррупция, есть еще неотчисляемые "контрактники", есть масса вещей, способных отбить всякую охоту заниматься. ну и о хорошем. мне пощаливилось учится у Елены Григорьевны Качко, низкий поклон. и я слышал про Вагана Терзияна, который помог многим из моих однопоточников найти себя за границей. а что касается повышения рейтинга дипломов, так я категорически против. сначала необходимо сделать так, чтобы диплом отражал степень знаний, а не лояльности к заведующему кафедрой, родство с ректором и толстый кошелек родителей. а уже потом можно говорить о каких преференциях. и единственная преференция, которую я вижу для студента с красным дипломом -- меньший испытательный срок, для магистра -- сразу должность и задачи мидла. никаких полновесных прибавок к зарплате, иначе скатимся обратно в совок. во всяком случае мне так кажется.
    Anton Naumov

  • Паш, [quote]превратить университеты в почти аутсорсовые компании[/quote] в принципе, так и происходит. ХНУРЭ раньше весьма плотно работал с Validio (теперь Global Logic), Телесенс с ХПИ, у ДатаАрта есть DataArt Lab - для студентов (больше всего похоже на то, что ты описываешь), есть и другие, так что идея не такая абсурдная, как ты сам озвучил :)
    Макс

  • To Anton Naumov: Антон, я бы не хотел превращать свой блог в сборище обозленных людей, поливающих друг друга грязью. Безусловно, это твой опыт и твое мнение насчет вышеописанных преподавателей. И если с тобой поступили нехорошо, то возможно, ты виноват в этом сам. И Марченко и Бондарева я хорошо знаю и уважаю, поэтому прошу не переходить на личности и не публиковать сомнительные намеки.
    Подлипенский Павел

Categories

Calendar

<<  Ноябрь 2008  >>
воповтсрчепясу
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

Archive

© Copyright 2008

Sign in

Ó÷àñòíèê ïëàíåòû Developers.org.ua

Bookmark and Share

Web Developement Blogs - Blog Catalog Blog Directory