2012-11-30 50 views
0

我有一個由多個項目組成的解決方案。其中一個項目是POCO對象的容器,在所有其他項目之間共享。由於這些對象需要與Windows Phone,Silverlight,Windows Apps等兼容,因此它僅作爲共享庫創建,僅包含一部分引用。向派生類中的成員添加數據註釋

我想重新使用這些對象作爲數據庫模型的代碼優先實現,這需要我向成員添加數據註釋屬性。但是數據標註名稱空間不包含在參考子集中。

所以我想我會在我的服務API項目中創建派生類,以在其中添加數據註釋。但我不太確定如何做到這一點,或者甚至可以做到。

所以我正在尋找一些想法,也許最佳實踐。當然,我可以創建新模型並使用映射技術從一個數據中獲取數據,但當它們完全相同時,這聽起來有點愚蠢。

回答

2

您是否嘗試過使用MetadataTypeAttribute

[MetadataType(typeof(Metadata))] 
public class DerivedEntity : PocoEntity 
{ 
    private sealed class Metadata 
    { 
     [Required, AnotherAnnotation] 
     public object NameOfPropertyToDecorate; 
    } 
} 

編輯
這是行不通的。如果將MetadataType屬性添加到基類,它將起作用;如果將其添加到派生類中,則註釋將被忽略。這種行爲感覺像一個錯誤,但可能有一個原因。

您最好的選擇可能是使用the fluent API來配置您的實體。

public class YourContext : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 
     modelBuilder.Configurations.Add(new PocoEntityConfiguration()); 
    } 
} 

public class PocoEntityConfiguration : EntityTypeConfiguration<PocoEntity> 
{ 
    public PocoEntityConfiguration() 
    { 
     Property(e => e.TheProperty) 
     .IsRequired() 
     .HasMaxLength(80) 
     ... 
     ; 
    } 
} 
+0

+1:我還沒試過,但聽起來很合理 – quetzalcoatl

+0

這不會起作用,因爲它的工作原理是相反的。這種方法需要您在POCO本身上聲明MetadataType,並指向保存元數據的其他類。我需要在引用POCO的另一個項目中擴展這個類,而不是相反。 – Jasper

+0

@Jasper:好像將MetadataType屬性添加到派生類*應該*工作,但不幸的是,至少在.NET 4.0中,它沒有。將屬性添加到基類確實可行,所以這可能是一個錯誤。看起來你唯一的選擇是使用流暢的配置API。 –