2013-06-17 3 views
3

У меня есть страницы ASP.NET WebForms, содержащий ASPxGridView и ObjectDataSource:GridView с ObjectDataSource UpdateMethod

<dx:ASPxGridView ID="gvEmployees" runat="server" 
    AutoGenerateColumns="False" DataSourceID="objDsEmployees" 
    KeyFieldName="EmployeeId"> 
    <Columns> 
     <dx:GridViewCommandColumn VisibleIndex="0"> 
      <EditButton Visible="True" /> 
     </dx:GridViewCommandColumn> 
     <dx:GridViewDataTextColumn FieldName="EmployeeId" VisibleIndex="1" /> 
     <dx:GridViewDataTextColumn FieldName="Name" VisibleIndex="2" /> 
     <dx:GridViewDataTextColumn FieldName="Email" VisibleIndex="3" /> 
     <dx:GridViewDataTextColumn FieldName="Telephone" VisibleIndex="5" /> 
    </Columns> 
</dx:ASPxGridView> 
<asp:ObjectDataSource ID="objDsEmployees" 
    runat="server" 
    ConflictDetection="CompareAllValues" 
    DataObjectTypeName="MySite.Data.Models.Employee" 
    DeleteMethod="Delete" 
    OldValuesParameterFormatString="original{0}" 
    InsertMethod="Insert" 
    SelectMethod="GetAll" 
    TypeName="MySite.Services.EmployeeService" 
    UpdateMethod="Update" /> 

модель Сотрудник содержит следующие свойства:

public class Employee 
{ 
    public int EmployeeId { get; set; } 

    public string Name { get; set; } 

    public string Email { get; 

    public string Password { get; set; } 

    public string Telephone { get; set; } 
} 

ObjectDataSource вызывает метод Update в эксплуатационном слое:

public void Update(Employee employee, Employee originalEmployee) 
{ 
    _db.Employees.Attach(originalEmployee); 
    _db.Entry(originalEmployee).CurrentValues.SetValues(employee); 
    _db.SaveChanges(); 
} 

Когда вызывается метод Update, параметры employee и originalEmployee содержат только свойства, используемые в качестве столбцов в ASPxGridView, а другие свойства (например, Password) являются нулевыми.

Есть ли способ сохранить эти значения где-нибудь? Кстати, я использую Entity Framework для доступа к данным и DevExpress для GridView.

ответ

2

Вы также можете решить эту проблему, установив ConflictDetection="CompareAllValues" в ObjectDataSource:

<asp:ObjectDataSource ID="objDsEmployees" 
    runat="server" 
    DeleteMethod="Delete" 
    InsertMethod="Insert" 
    SelectMethod="GetAll" 
    UpdateMethod="Update" 
    DataObjectTypeName="App.Core.Domain.Employee" 
    TypeName="App.Core.Services.EmployeeService" 
    OldValuesParameterFormatString="original{0}" 
    ConflictDetection="CompareAllValues" /> 

Затем в методе Update в EmployeeService мы забираем оригинальный работника первого его идентификатор, то мы сливаемся этот оригинальный сотрудник с обновленным сотрудником , Это гарантирует, что не обновленные свойства не станут нулевыми, но для этого требуется дополнительный вызов в базу данных:

public void Update(Employee originalEmployee, Employee employee) 
{ 
    // Get the original employee by its id. 
    Employee fullOriginalEmployee = GetById(originalEmployee.EmployeeId); 

    // Merge the data of the updated employee with the original employee. 
    fullOriginalEmployee.Name = employee.Name; 
    fullOriginalEmployee.Email = employee.Email; 
    fullOriginalEmployee.Telephone = employee.Telephone; 
    fullOriginalEmployee.BirthDate = employee.BirthDate; 

    // Persist changes in database. 
    SaveChanges(); 
} 
0

Я решил эту проблему путем изменения ObjectDataSource к:

<asp:ObjectDataSource 
    ID="objDsEmployees" 
    runat="server" 
    DeleteMethod="Delete" 
    InsertMethod="Insert" 
    SelectMethod="GetAll" 
    TypeName="MySite.Services.EmployeeService" 
    UpdateMethod="Update"> 
    <UpdateParameters> 
     <asp:Parameter Name="employeeId" Type="Int32" /> 
     <asp:Parameter Name="name" Type="String" /> 
     <asp:Parameter Name="email" Type="String" /> 
    </UpdateParameters> 
</asp:ObjectDataSource> 

и метод Update в слое обслуживания для:

public void Update(int employeeId, string name, string email) 
{ 
    var employee = GetById(employeeId); 
    employee.Name = name; 
    employee.Email = email; 

    _db.SaveChanges(); 
} 

Других решений, однако, более чем приветствуются!

Смежные вопросы