如何在 ORM 中将我的代码设置为 DB First
How to setup my code as DB First in an ORM
我研究过使用 EF、nHibernate 和 Dapper/Dapper.SimpleCRUD。在其中的 none 中,我可以弄清楚如何表示关于我的数据库(SQL Server 2012)模型的用例。我正在使用 C# 4.0/.NET 4.0(由于技术限制)构建一个带有网格的 ASP.NET 网站,该网站将具有 CRUD 功能,网格的初始状态由下拉菜单设置。
我的两张表是这样设置的:
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]
Distribution 和 Address_Book 之间存在多对一关系,其中 Address_book.EntryID = Distribution.EntryID。
如能提供有关如何设置的任何帮助,我们将不胜感激。我在手动管理 CRUD 操作时遇到问题,所以我认为 ORM 会有所帮助,但我无法弄清楚。感谢任何帮助。
提前致谢!
整个 .net CRUD 是一个广阔的领域,有很多风格和工作方式。虽然我不确切知道您对此的看法,但以下是我的帮助。根据我的经验,EF 可以很好地处理关系,尽管整个 EF 学习过程有点陡峭,我已经回避它。我通常使用带扩展的 Dapper 并做一些事情 pseudo-manually。我没有使用过 SimpleCrud 扩展。由于您继承了数据库,希望它设置良好,并且在分布、列 EntryID 上有 FK 约束。
在 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>
您可以在后面的代码中加载它(并为 pre-sorting 添加 lambda 表达式):
gvAddresses.DataSource = Jacrys.AddressBook.GetAll().OrderBy(c=>c.Last_Name);
您需要的任何下拉菜单都可以用类似的方式加载。
一切都取决于您的需求。如果您有 Distribution 的网格视图,那么您可以在编辑模式下(在行数据绑定事件中)为地址添加下拉列表。当你去更新和保存时,你必须在行中找到控件并在保存记录之前解析它的选定值。确实没有一种绝妙的方法可以完成这项工作。不过,如果您的所有业务 类 都使用 CRUD 方法设置,则可以更简单地将它们连接在一起。
我研究过使用 EF、nHibernate 和 Dapper/Dapper.SimpleCRUD。在其中的 none 中,我可以弄清楚如何表示关于我的数据库(SQL Server 2012)模型的用例。我正在使用 C# 4.0/.NET 4.0(由于技术限制)构建一个带有网格的 ASP.NET 网站,该网站将具有 CRUD 功能,网格的初始状态由下拉菜单设置。
我的两张表是这样设置的:
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]
Distribution 和 Address_Book 之间存在多对一关系,其中 Address_book.EntryID = Distribution.EntryID。
如能提供有关如何设置的任何帮助,我们将不胜感激。我在手动管理 CRUD 操作时遇到问题,所以我认为 ORM 会有所帮助,但我无法弄清楚。感谢任何帮助。
提前致谢!
整个 .net CRUD 是一个广阔的领域,有很多风格和工作方式。虽然我不确切知道您对此的看法,但以下是我的帮助。根据我的经验,EF 可以很好地处理关系,尽管整个 EF 学习过程有点陡峭,我已经回避它。我通常使用带扩展的 Dapper 并做一些事情 pseudo-manually。我没有使用过 SimpleCrud 扩展。由于您继承了数据库,希望它设置良好,并且在分布、列 EntryID 上有 FK 约束。
在 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>
您可以在后面的代码中加载它(并为 pre-sorting 添加 lambda 表达式):
gvAddresses.DataSource = Jacrys.AddressBook.GetAll().OrderBy(c=>c.Last_Name);
您需要的任何下拉菜单都可以用类似的方式加载。
一切都取决于您的需求。如果您有 Distribution 的网格视图,那么您可以在编辑模式下(在行数据绑定事件中)为地址添加下拉列表。当你去更新和保存时,你必须在行中找到控件并在保存记录之前解析它的选定值。确实没有一种绝妙的方法可以完成这项工作。不过,如果您的所有业务 类 都使用 CRUD 方法设置,则可以更简单地将它们连接在一起。