使用Entity Framework和WCF Ria Services開發(fā)SilverLight之3:Map
在上一篇中《使用Entity Framework和WCF Ria Services開發(fā)SilverLight之2:POCO》,我們將映射交給edmx文件處理。如下:
該文件是由EF框架自動生成的,通過查看原始文件,我們可以看到EF框架為我們建立了實體類間的各種映射。現(xiàn)在,借助于EF4.1框架,我們可以進行更方便的進行手動映射。
1:清理SchoolData
首先,刪除ModelSchool.edmx。
其次,由于不再使用edmx映射,我們將SchoolContext中數(shù)據(jù)庫連接串,換成傳統(tǒng)的連接串。即:
上圖中的紅框部分,換成:
相信你和我一樣,非常熟悉這樣的連接字符串。
二:手動建立Map
在SchoolModel中,我們建立一個Mapping子目錄,將所有的映射類全部建立在這個位置。如DepartmentMap:
public class DepartmentMap : EntityTypeConfiguration<Department>
{
public DepartmentMap()
{
this.HasKey(t => t.DepartmentID);
this.ToTable("Department");
}
}
需要注意的一點,理論上,我們可以借助于Map,生成完全意義上的Poco,因為我們使用EF4.1框架,通過重寫DbContext類型的OnModelCreating方法,如下:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
modelBuilder.Configurations.Add(new DepartmentMap());
}
我們完全可以動態(tài)為POCO實體類生成EF所需要的各種映射關(guān)系。但是,很遺憾,在這里我們使用的Ria Service。在使用Ria Service的使用,必須要為Poco指定一個Key(這是一個BUG?),否則,我們會得到這樣的一個錯誤:
錯誤 2 The entity 'Department' in DomainService 'DomainServiceSchool' does not have a key defined. Entities exposed by DomainService operations must have at least one public property marked with the KeyAttribute. SilverlightApplication20110612
而如果我們在使用別的應用,我指的是僅僅使用EF,則不會有這樣的編譯期錯誤出現(xiàn)。
所以,這是一個小小的瑕疵,請為POCO使用KEY特性。當然,別的映射關(guān)系我們可以在Map類中處理。
最后的運行效果為:
三:使用Entity Framework Power Tools CTP1自動生成POCO和映射
也許是考慮到手動生成POCO和映射太繁瑣了,現(xiàn)在微軟為我們提供了這樣一個工具為我們自動生成POCO和映射。你需要到這里去下載它:http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d
安裝完畢后,請首先生成一個C#類庫項目,然后在這個類庫項目上點右鍵,我們會發(fā)現(xiàn)多了一個菜單項:
然后,在下一界面,輸入相應參數(shù):
注意:一定要注冊圖中的紅框部分。請選擇第一項。如果我們使用sql server身份認證,則極有可能出現(xiàn)如下錯誤:
System.Data.ProviderIncompatibleException: The provider did not return a ProviderManifestToken string. ---> System.InvalidOperationException: This operation requires a connection to the 'master' database. Unable to create a connection to the 'master' database because the original database connection has been opened and credentials have been removed from the connection string. Supply an unopened connection. ---> System.Data.SqlClient.SqlException: 用戶 'sa' 登錄失敗。
有博友曾經(jīng)對此問題進行過討論,但是仍舊無解,具體請見博文及文后回復《Entity Framework Code First使用者的福音 --- EF Power Tool使用記之二(問題探究)》
最后,該工具為我們生成的代碼大致如下:
如果對手動映射感興趣,還可以參考下列文章:








浙公網(wǎng)安備 33010602011771號