2012-09-25 68 views
1

我已經開始玩Dapper.Net了,到目前爲止我非常喜歡它 - 但是,我遇到了一個問題。Dapper.Net和Dapper.Net擴展是否有與「NotMapped」相當的功能?

說,我有一個POCO類,如:

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string FullName { get { return FirstName + " " + LastName; } } 
} 

現在,使用Dapper.Net和Dapper.Net擴展,我想簡單地加載從DB數據類型的所有實例做這個:

string connectionString = CloudConfigurationManager.GetSetting("DBConnection"); 
using (SqlConnection cn = new SqlConnection(connectionString)) 
{ 
    cn.Open(); 

    IEnumerable<Types.Person> entities = cn.GetList<Types.Person>(); 
    var forceMe = entities.ToList(); 
} 

這正常的LINQ的設置,但是當它擊中符合.ToList(),強制評估,它與全名「無效列名」炸燬。考慮到它可能會尊重Entity Framework DataAnnotations的NotMapped東西,我嘗試添加一個NotMapped屬性(將EF 5添加到項目之後)。這沒有奏效。

所以,問題是,我該如何告訴Dapper.Net一個列不是從數據庫中預期的?這是擴展的問題,試圖爲模型POCO中的所有內容映射數據庫列?我是否需要恢復編寫SQL,並明確要求僅需要的列,或者是否有方法可以在列上獲取等同於NotMapped的值?

在此先感謝。

- 亞當

+0

我越考慮這一點,我越覺得這是小巧玲瓏的擴展的產品,而不是Dapper.Net本身。看來,如果我使用核心Dapper的東西,並明確建立一個列列表,或者使用通配符(*),我也沒有問題。它似乎只有在使用GetList擴展時出現這個問題 - 似乎是詢問類(通過反射?)並建立每個公共屬性都有表中匹配列的期望... –

回答

5

我認爲從被映射忽略某些屬性的唯一途徑是實施auto class mapper,在那裏你可以指定你的自定義字段映射。例如:

public class CustomMapper : ClassMapper<Foo> 
{ 
    public CustomMapper() 
    { 
     Table("FooTable"); 
     Map(f => f.Id).Column("FooId").Key(KeyType.Identity); 
     Map(f => f.DateOfBirth).Column("BirthDate"); 
     Map(f => f.FirstName).Column("First"); 
     Map(f => f.LastName).Column("Last"); 
     Map(f => f.FullName).Ignore(); 
     Map(f => f.Calculated).ReadOnly(); 
    } 
} 

public class Foo 
{ 
    public int Id { get; set; } 
    public DateTime DateOfBirth { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string FullName 
    { 
     get { return string.Format("{0} {1}", FirstName, LastName); } 
    } 
} 

在上面的示例中,FullName被忽略。

自動映射器還允許您調整表名稱,以防您的POCO類名稱與表名不匹配。

另外,請記住,您必須將您的自定義地圖保存在與POCO類相同的程序集中。該庫使用反射來查找自定義地圖,它只掃描一個程序集。

希望這有助於 好運

+0

謝謝!這正是我正在尋找的 - 雖然它比我希望的重一點... :) –