Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Asp.Net Binding ObJectDataSource 
V
    Опции темы
Veitmen
Дата 13.3.2009, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 10.11.2006
Где: СПБ

Репутация: нет
Всего: 4



Всем привет. Решил попробовать связать грид с данными через ObjectDataSource. БД Northwind таблица Customers, Orders, Order_Details. Класс с маппингом для Customer сгенерил стандартный дизайнер. Ничего более не менял.
Итак класс родитель для всех Linq to sql classes:
Код

public class Entity<T> where T : class
    {
        public virtual void Detach(T entity)
        {

        }

        public List<T> Get()
        {
            NorthWindDataContext ctx = new NorthWindDataContext();
            return ctx.GetTable<T>().ToList();
        }

        public void Insert(T entity)
        {
            NorthWindDataContext ctx = new NorthWindDataContext();
            ctx.GetTable<T>().InsertOnSubmit(entity);
            ctx.SubmitChanges();
        }

        public virtual void Update(T entity)
        {
            NorthWindDataContext ctx = new NorthWindDataContext();

            Detach(entity); // Это под вопросом
            ctx.GetTable<T>().Attach(entity);
            ctx.SubmitChanges();
        }

        public void Delete(T entity)
        {
            NorthWindDataContext ctx = new NorthWindDataContext();
            Detach(entity); // Это под вопросом
            ctx.GetTable<T>().Attach(entity); 
            ctx.GetTable<T>().DeleteOnSubmit(entity);
            ctx.SubmitChanges();
        }
    }

partial  классы:
Код

partial class NorthWindDataContext
    {
        partial void DeleteCustomer(Customer instance)
        {
            foreach (Order order in instance.Orders)
            {
                this.DeleteOrder(order);
            }
            this.ExecuteDynamicDelete(instance);
        }

        partial void DeleteOrder(Order instance)
        {
            foreach (Order_Detail detail in instance.Order_Details)
            {
                this.DeleteOrder_Detail(detail);
            }
            this.ExecuteDynamicDelete(instance);
        }

        partial void DeleteOrder_Detail(Order_Detail instance)
        {
            this.ExecuteDynamicDelete(instance);
        }
    }

    partial class Customer : Entity<Customer>
    {
        public override void Detach(Customer entity)
        {
            foreach (Order order in this.Orders)
            {
                order.Detach(order);
            }
        }
    }

    partial class Order : Entity<Order>
    {
        public override void Detach(Order entity)
        {
            foreach (Order_Detail detail in this.Order_Details)
            {
                detail.Detach(detail);
            }
            entity._Customer = default(EntityRef<Customer>);
        }
    }

    partial class Order_Detail : Entity<Order_Detail>
    {
        public override void Detach(Order_Detail entity)
        {
            entity._Order = default(EntityRef<Order>);
        }
    }

И само собой разметка :
Код

<asp:GridView ID="customerGrid" runat="server" AllowPaging="True" 
                        AutoGenerateColumns="False" CellPadding="4" DataSourceID="ObjectDataSource1" 
                        ForeColor="#333333" GridLines="None" style="margin-right: 0px">
                        <RowStyle BackColor="#FFFBD6" ForeColor="#333333" />
                        <Columns>
                            <asp:CommandField ShowEditButton="True" ShowSelectButton="True" />
                            <asp:BoundField DataField="CustomerID" HeaderText="CustomerID" 
                                SortExpression="CustomerID" />
                            <asp:BoundField DataField="CompanyName" HeaderText="CompanyName" 
                                SortExpression="CompanyName" />
                            <asp:BoundField DataField="ContactName" HeaderText="ContactName" 
                                SortExpression="ContactName" />
                            <asp:BoundField DataField="ContactTitle" HeaderText="ContactTitle" 
                                SortExpression="ContactTitle" />
                            <asp:BoundField DataField="Address" HeaderText="Address" 
                                SortExpression="Address" />
                            <asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />
                            <asp:BoundField DataField="Region" HeaderText="Region" 
                                SortExpression="Region" />
                            <asp:BoundField DataField="PostalCode" HeaderText="PostalCode" 
                                SortExpression="PostalCode" />
                            <asp:BoundField DataField="Country" HeaderText="Country" 
                                SortExpression="Country" />
                            <asp:BoundField DataField="Phone" HeaderText="Phone" SortExpression="Phone" />
                            <asp:BoundField DataField="Fax" HeaderText="Fax" SortExpression="Fax" />
                        </Columns>
                        <FooterStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
                        <PagerStyle BackColor="#FFCC66" ForeColor="#333333" HorizontalAlign="Center" />
                        <SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="Navy" />
                        <HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
                        <AlternatingRowStyle BackColor="White" />
                    </asp:GridView>
                    <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
                        DataObjectTypeName="AS.Study.LinqTask.Customer" SelectMethod="Get" 
                        TypeName="AS.Study.LinqTask.Customer" UpdateMethod="Update">
                    </asp:ObjectDataSource>

Проблема в том что когда я редактирую Customers весь код отлично выполняется, но изменения в бд не записываются. В чем проблема может быть? Где я что делаю не так?

PM MAIL ICQ   Вверх
Veitmen
Дата 13.3.2009, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 10.11.2006
Где: СПБ

Репутация: нет
Всего: 4



Разобрался. Я упустил тот факт что когда мы просто аттачим объект, то подразумевается что мы его еще не редактировали, т.е. редактировать объект стоит только после аттача (когда объект уже в контексте). Такой вариант не подходит для данной задачи.
Для того что бы решить эту задачу следует использовать метод Attach(entity, true). Второй параметр говорит о том что объект изменен вне контекста и следует произвести Update в бд. Что бы этот метод работал у сущности Linq должно быть поле отслеживающее версию объекта. 
Я в качестве версии пометил поля которые являются PK. 
Возникает вопрос, версия у меня не будет меняться при изменении объекта в БД,Какие последствия будут в результате такого действия?
P.S.: На блокировки мне фиолетово пока.

Добавлено @ 12:58
Короче понятно. Просто напросто будет работать схема: кто последний тот и прав. Никаких блокировок при этом нет...

Это сообщение отредактировал(а) Veitmen - 13.3.2009, 12:58
PM MAIL ICQ   Вверх
PashaPash
Дата 13.3.2009, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 4
Всего: 49



Veitmen, поле версии - это обычно TimeStamp. Ровный способ сделать "кто последний тот и прав" - выставить UpdateCheck="Never" у всех полей.


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | LINQ (Language-Integrated Query) | Следующая тема »


 




[ Время генерации скрипта: 0.0695 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.