隆重推薦:DAC 4.0 全新發布


DAC 4.0 是一個全新的版本, 幾乎全部重寫了以前的代碼,設計的結構也簡化很多,基於.net4,使用lambda表達式代替反射,去除大量過時的功能(如DataTable和DataSet的相關功能等),去除自定義表達式部分,通過解析lambda表達式實現自定義條件查詢。 使用.net自帶Configuration功能,只要web.config或app.config,不需要額外的配置文件,方便配置使用;去除xml mapping方式,支持DLinq屬性。支持多種數據庫(已測試sql server, mysql, sqlite及oracle), 支持mono(ubuntu 11.10 +  mono 2.10.5 + mysql 5.1.58測試通過)。

代碼示例:

初啟化,通過配置文件或connection string構造DataContext:

var dc = new DataContext("RaisingStudio.Data.TestProject.Properties.Settings.DefaultConnectionString");

var dc = new DataContext("server=localhost;User Id=root;password=root;database=test;");

lambda表達式查詢:

var q = this.dc.Query<Item>(i => i.Name == "test" && i.Status == "ok");

或linq查詢:

var q = from s in dc.GetQuery<Supplier>() 
where s.SuppId > 0 && s.Name == "for Test3"
select s;

增刪改:

this.dc.Insert<Product>(new Product
{
ProductId = Guid.NewGuid().ToString(),
CategoryId = categoryId,
Name = "for Test4"
});


this.dc.Delete<Supplier>(suppId);

this.dc.Update<Product>(product);

this.dc.Save<Category>(category);

通過主鍵獲取單個實例:

var product = this.dc.GetEntity<Product>(productId);

支持排序和分頁:

List<Item> items = this.dc.Query<Item>(ExpressionExtension.Empty<Item>().Take(3)).ToList();
var q = (from i in this.dc.GetQuery<Item>()
select i).Skip(1).Take(2);
int count = this.dc.Query<Item>(ExpressionExtension.Empty<Item>().Skip(1)).Count();

部分列:

this.dc.Save<Item>(item, new string[] { "UnitCost" });

this.dc.Insert<Item>(item, new Expression<Func<Item, object>>[]
{
i => i.ItemId,
i => i.Name,
i => i.ListPrice,
i => i.ProductId,
i => i.Status
});

無實例類查詢:

Command command = new Command("SELECT * FROM Product WHERE CategoryId = @p1");
command.AddParameter("@p1", categoryId);
var q = this.dc.Query(command);
int count = 0;
foreach (dynamic p in q)
{
Assert.IsNotNull(p);
Assert.AreEqual(p.CategoryId, categoryId);
count++;
}

事務處理:

            this.dc.BeginTransaction();
try
{
int result = this.dc.Insert<Supplier>(new Supplier
{
Name = "s for Test6",
Status = "done",
City = "dalian"
});

int suppId = Convert.ToInt32(this.dc.GetIdentity<Supplier>());
result = this.dc.Delete<Supplier>(suppId);

Category category = new Category
{
CategoryId = Guid.NewGuid().ToString(),
Name = "c for Test6",
Descn = "d for Test6"
};
Product product = new Product
{
ProductId = Guid.NewGuid().ToString(),
Name = "p for Test6",
Descn = "d for Test6",
CategoryId = category.CategoryId
};
result = this.dc.Insert<Category>(category);
result = this.dc.Insert<Product>(product);

this.dc.CommitTransaction();
}
catch (Exception ex)
{
this.dc.RollbackTransaction();
throw ex;
}

配置文件示例:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="raisingstudio.data" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="CommandConverter.Settings" type="RaisingStudio.Data.CommandConverterSettings, RaisingStudio.Data" />
<section name="CommandBuilder.Settings" type="RaisingStudio.Data.CommandBuilderSettings, RaisingStudio.Data" />
</sectionGroup>
</configSections>
<system.data>
<DbProviderFactories>
<add name="System.Data.SQLite" invariant="System.Data.SQLite" description="ADO.NET Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
<add name="Oracle.DataAccess" invariant="Oracle.DataAccess" description="Oracle.DataAccess" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess" />
</DbProviderFactories>
</system.data>
<raisingstudio.data>
<CommandConverter.Settings>
<add name="System.Data.OracleClient" providerName="System.Data.OracleClient" usePositionalParameters="false" parameterPrefix=":" useParameterPrefixInParameter="false" useParameterPrefixInSql="true" />
<add name="Oracle.DataAccess" providerName="Oracle.DataAccess" usePositionalParameters="false" parameterPrefix=":" useParameterPrefixInParameter="false" useParameterPrefixInSql="true" />
</CommandConverter.Settings>
<CommandBuilder.Settings>
<add name="MySql.Data.MySqlClient" providerName="MySql.Data.MySqlClient" pagingMethod="LIMIT" identityMethod="LAST_INSERT_ID" useBrackets="false" />
<add name="System.Data.SQLite" providerName="System.Data.SQLite" pagingMethod="LIMIT" identityMethod="LAST_INSERT_ROWID"/>
<add name="System.Data.OracleClient" providerName="System.Data.OracleClient" pagingMethod="ROWNUM" identityMethod="CURRVAL" />
<add name="Oracle.DataAccess" providerName="Oracle.DataAccess" pagingMethod="ROWNUM" identityMethod="CURRVAL" useBrackets="false" />
</CommandBuilder.Settings>
</raisingstudio.data>
<connectionStrings>
<add name="RaisingStudio.Data.TestProject.Properties.Settings.DefaultConnectionString"
connectionString
="Data Source=localhost;Initial Catalog=test;Integrated Security=True"
providerName
="System.Data.SqlClient" />
<add name="RaisingStudio.Data.TestProject.Properties.Settings.MySqlConnectionString"
connectionString
="server=localhost;User Id=root;password=root;Persist Security Info=True;database=test"
providerName
="MySql.Data.MySqlClient" />
<add name="RaisingStudio.Data.TestProject.Properties.Settings.SqliteConnectionString"
connectionString
="Data Source=test.db" providerName="System.Data.SQLite" />
<add name="RaisingStudio.Data.TestProject.Properties.Settings.OracleConnectionString"
connectionString
="Data Source= (DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = zhongzf-PC)(PORT = 1522)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE) ) );User Id=demo;Password=demo;"
providerName
="Oracle.DataAccess" />
</connectionStrings>
</configuration>

 

下載地址:http://dac.codeplex.com/

相關閱讀:

http://www.cnblogs.com/zhongzf/archive/2009/04/05/1429780.html (實體生成工具使用RazorEngine,模版可輕松實制)

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM