2011-12-21 40 views
1

映射碼錶在我的數據庫中,有一個大的「代碼」表系統的代碼看起來起坐各地使用的系統值。像這樣:在BLToolkit

[TableName("code_entries")]       public class Code { 
    [MapField("code_nbr")][PrimaryKey, Identity] public int Id; 
    [MapField("code")]        public string Value; 
} 

我是新來BLToolkit了,很希望能有類似於我所看到的靜態映射一個概念,但是,讓我可以輕鬆地在其他表映射這些代碼的出現其各自的值。例如:

[TableName("person")]        public class Person { 
     [MapField("person_nbr")][PrimaryKey, Identity] public int Id; 
     [MapField("dob")][Nullable]      public int BirthDate; 
     [MapField("eye_color")][Nullable]    public int EyeColorCode; 
     [MapField("hair_color")][Nullable]    public int HairColorCode;  
} 

如果EyeColorCode和HairColorCode上述地圖在代碼表中的值,可以創建一個簡單的方法來映射或班級內的數據,並獲得在單個查詢整個對象?

我想的東西,如落得:

// person.Id = 1 
// person.DOB = some date 
// person.EyeColor = "Blue" 
// person.HairColor = "Brown" 

回答

1

這不是你真正想要的東西,但你可以使用Associations

所以你可以添加到您的Person類

[Association(ThisKey="eye_color", OtherKey="code_nbr", CanBeNull=true)] 
public Code EyeColor; 

[Association(ThisKey="hair_color", OtherKey="code_nbr", CanBeNull=true)] 
public Code HairColor; 

然後做類似

from p in db.Person 
select new 
{ 
    Id  = p.Id, 
    DOB  = p.BirthDate, 
    EyeColor = p.EyeColor.Value, 
    HairColor = p.HairColor.Value 
}; 

反正這些看似規範的,幾乎從來沒有改變 我通常會在啓動把這些在客戶端上,然後填寫說明,當我顯示的數據的類型,讓一切都輕鬆了很多,如果我不能找到一個ID,然後在我剛 刷新集合

+0

我們有一些這樣的代碼在數據中做了足夠的改變。這是我前進的道路,但問題在於它迫使我重新指定新對象(在您的示例中爲Id和DOB)中的所有其他列,並阻止我使用生成的數據庫類(Person )而不重建它。這些代碼值被用在我們許多表中,所以我根本無法使用生成的類。 – Jason 2011-12-28 21:47:53

1

感謝大衛。我去你的方法,但修改了它稍微讓它少一點痛苦的形式我。我在你的例子中添加了關聯到我的類:

[Association(ThisKey = "EyeColorCode", OtherKey = "Id")] public Code EyeColor { get; set; } 
[Association(ThisKey = "HairColorCode", OtherKey = "Id")] public Code HairColor { get; set; } 

然後我寫了一個擴展方法。它需要一個新的對象,併合並所有可寫的屬性到源對象。利用這一點,我不需要我的查詢中指定的每一個屬性,即:

from p in db.Person 
select p.PropertyUnion(new Person() { 
{ 
    EyeColor = p.EyeColor, 
    HairColor = p.HairColor 
}; 

這爲我節省了相當多的代碼,我的一些更復雜的對象,我認爲這是更具可讀性。以下是擴展方法的代碼:

/// <summary> 
/// Union by retrieving all non-null properties from source parameter and setting those properties on the instance object 
/// </summary> 
public static T PropertyUnion<T>(this T destination, T source) { 
    // Don't copy from a null object 
    if (Object.ReferenceEquals(source, null) || Object.ReferenceEquals(destination, null)) { 
     return destination; 
    } 
    // copy properties 
    foreach (var property in source.GetType().GetProperties()) { 
     if (!property.CanWrite || !property.CanRead) 
      continue; 
     var match = destination.GetType().GetProperty(property.Name); 
     if (!match.CanWrite || !match.CanRead) 
      throw new MethodAccessException("Matching property '" + match.Name + "' must allow both read and write operations."); 
     var value = property.GetValue(source, null); 
     if (value != null && !value.Equals(Activator.CreateInstance(property.PropertyType))) 
      match.SetValue(destination, value, null); 
    } 
    return destination; 
} 

再次感謝您的幫助!