1

Я рассмотрел использование EF, nHibernate и Dapper/Dapper.SimpleCRUD. Ни в одном из них я не могу понять, как представить мой пример использования в моей базе данных (SQL Server 2012). Я создаю веб-сайт ASP.NET с сеткой в ​​C# 4.0/.NET 4.0 (из-за технических ограничений), которые будут иметь возможности CRUD, при этом начальное состояние сетки задается выпадающими списками.Как настроить мой код как DB Сначала в ORM

Мои две таблицы настроены так:

Address_Book 
|_[EntryID] 
|_[Last_Name] 
|_[First_Name] 
|_[Title] 
|_[Office_Num] 
|_[Cell_Num] 
|_[Home_Num] 
|_[Email_Address] 
|_[Special_Info] 
|_[hr24_Emails] 
|_[hr48_Emails] 
|_[RM_Emails] 
|_[Prestige_Emails] 
|_[GEB_Emails] 
|_[LAW_Emails] 

Distribution 
|_[Brand] 
|_[Location_Mnemonic] 
|_[Location_Code_Numeric] 
|_[EntryID] 
|_[Division_Mnemonic] 
|_[Region_Mnemonic] 
|_[Zone_Mnemonic] 
|_[District_Mnemonic] 
|_[Key] 

С отношения многие-к-одному между распределением и Address_Book где Address_book.EntryID = Distribution.EntryID.

Любая помощь в том, как настроить это, будет оценена по достоинству. У меня возникают проблемы с управлением операциями CRUD вручную, поэтому я подумал, что ORM поможет, но я не могу понять это. Любая помощь приветствуется.

Заранее благодарен!

+0

С чем вы столкнулись? GridView? Настройка классов? Настройка сетки, которая использует выпадающий список в качестве селектора? – secretwep

+0

Настройка классов, которые отображаются в логической модели. У меня есть модель в моей голове о том, как она должна работать, но делать это бывает досадно. Запись AddressBook может иметь несколько распределений, связанных с ней, и придумать, как создать класс, который может создавать новые дистрибутивы, а также обновлять выходящие из него дистрибутивы. – Jacrys

+0

Что такое EntryID? Это из другого стола? Верно ли, что один адрес может иметь только один дистрибутив? – secretwep

ответ

0

Вся вещь .net CRUD - это большое царство с множеством вкусов и способов выполнения работы. И хотя я точно не знаю, с чем это связано, следую моей помощи. По моему опыту, EF хорошо справляется с отношениями, хотя весь процесс обучения EF немного крут, и я уклонился от него. Обычно я использую Dapper с расширениями и делаю псевдо-вручную. Я не использовал расширение SimpleCrud. Поскольку вы унаследовали БД, мы надеемся, что он настроен хорошо, и есть ограничение FK на Distribution, EntryID столбца.

В Dapper, вы можете настроить свои классы, как:

using Dapper.Contrib.Extensions; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.SqlClient; 

namespace Jacrys 
{ 
    [Table("dbo.address_book")] 
    public partial class AddressBook 
    { 
     [Dapper.Contrib.Extensions.Key] 
     public int EntryID { get; set; } 
     public string Last_Name { get; set; } 
     public string First_Name { get; set; } 
     public string Title { get; set; } 
     public string Office_Num { get; set; } 
     public string Cell_Num { get; set; } 
     public string Home_Num { get; set; } 
     public string Email_Address { get; set; } 
     public bool Special_Info { get; set; } 
     public bool hr24_Emails { get; set; } 
     public bool hr48_Emails { get; set; } 
     public bool RM_Emails { get; set; } 
     public bool Prestige_Emails { get; set; } 
     public bool GEB_Emails { get; set; } 
     public bool LAW_Emails { get; set; } 

     //use this only if you need all of the distributions to be 
     //part of your main AddressBook class 
     public IEnumerable<Distribution> Distributions { get; set; } 

     public static AddressBook GetById(short id) 
     { 
      using (IDbConnection cn = new SqlConnection("getConnString")) 
      { 
       cn.Open(); 
       return cn.Get<AddressBook>(id); 
      } 
     } 

     public static IEnumerable<AddressBook> GetAll() 
     { 
      using (IDbConnection cn = new SqlConnection("getConnString")) 
      { 
       cn.Open(); 
       return cn.GetAll<AddressBook>(); 
      } 
     } 

     public int Insert() 
     { 
      using (IDbConnection cn = new SqlConnection("getConnString")) 
      { 
       cn.Open(); 
       return (int)cn.Insert(this); 
      } 
     } 
     public bool Update() 
     { 
      using (IDbConnection cn = new SqlConnection("getConnString")) 
      { 
       cn.Open(); 
       return cn.Update(this); 
      } 
     } 
     public bool Delete() 
     { 
      using (IDbConnection cn = new SqlConnection("getConnString")) 
      { 
       cn.Open(); 
       return cn.Delete(this); 
      } 
     } 
    } 

    [Table("dbo.distribution")] 
    public partial class Distribution 
    { 
     [Dapper.Contrib.Extensions.Key] 
     public int Key { get; set; } 
     public int EntryID { get; set; } 
     public string Brand { get; set; } 
     public string Location_Mnemonic { get; set; } 
     public int Location_Code_Numeric { get; set; } 
     public string Division_Mnemonic { get; set; } 
     public string Region_Mnemonic { get; set; } 
     public string Zone_Mnemonic { get; set; } 
     public string District_Mnemonic { get; set; } 

     //similar CRUD methods to AddressBook follow here 
    } 
} 

Затем с GridView, как:

<asp:GridView ID="gvAddresses" runat="server" AutoGenerateColumns="true" DataKeyNames="EntryID"> 
</asp:GridView> 

Вы можете загрузить его в коде позади с (и добавить лямбда-выражения для предварительной сортировки):

gvAddresses.DataSource = Jacrys.AddressBook.GetAll().OrderBy(c=>c.Last_Name); 

Любые выпадающие списки, которые вам нужны, могут быть загружены аналогичным образом.

Все зависит от ваших потребностей. Если у вас есть gridview of Distribution, вы можете добавить выпадающий список для Address в режиме редактирования (в событии, связанном с данными строки). Когда вы переходите на обновление и сохранение, вам нужно будет найти элемент управления в строке и проанализировать его выбранное значение перед сохранением записи. На самом деле не один отличный способ сделать это. Хотя, если у вас есть все ваши бизнес-классы, созданные с помощью методов CRUD, вы можете связать все это проще.

+0

Спасибо! По какой-то причине я не мог обмануть голову! – Jacrys