2011-11-09 87 views
2

我試圖創建一個使用實體框架4.2 SQL CE 4.0數據庫和第一個對象。WCF ExtensionDataObject導致實體框架4.2失敗創建數據庫

我的類在WCF服務定義。

我有一個基類:

public class BaseData 
{ 
    public DateTime LastUpdated { get; set; } 
    public int StatusTypeId { get; set; } 
    public StatusType StatusType { get; set; } 
    public RecordStatusEnum RecordStatus { get; set; } 
} 

和一個繼承類:

public class JobType : BaseData 
{ 
    public int JobTypeId { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public int SortOrder { get; set; } 

    public virtual ICollection<Role> Roles { get; set; } 
} 

當基類是通過WCF序列化它添加一個ExtensionDataObject財產

public partial class BaseData : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged { 

    [System.NonSerializedAttribute()] 
    private System.Runtime.Serialization.ExtensionDataObject extensionDataField; 

    [global::System.ComponentModel.BrowsableAttribute(false)] 
    public System.Runtime.Serialization.ExtensionDataObject ExtensionData { 
     get { 
      return this.extensionDataField; 
     } 
     set { 
      this.extensionDataField = value; 
     } 
    } 

這從JobType類創建表時會導致EF崩潰,並出現以下錯誤:

沒有在設置JobTypes

如何解決此房產JobType.ExtensionData指定映射?

回答

0

添加NotMappedExtensionData property屬性從映射中排除。你不能堅持這個領域。

+0

如何以及在哪裏,你會添加NotMapped屬性? –

+0

在你不想映射的屬性上 - 在你的情況下它是'ExtensionData'。 –

+0

它不是我創建的屬性 - 它是在代理中自動創建的。我想擺脫財產。 –

3

在你的數據上下文定義,覆蓋OnModelCreating忽略了extensiondata財產來源於類:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Ignore<System.Runtime.Serialization.ExtensionDataObject>(); 
    base.OnModelCreating(modelBuilder); 
} 
+0

有趣。將檢查了這一點。 –

0

JobType類,你可以通過重新聲明它作爲private隱藏繼承ExtensionData財產。要做到這一點,你需要包括private後的關鍵字new分辯。這告訴編譯器你想隱藏基類的屬性,並使用這個聲明。

public class JobType : BaseData { 
    public int JobTypeId { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public int SortOrder { get; set; } 

    public virtual ICollection<Role> Roles { get; set; } 

    [global::System.ComponentModel.BrowsableAttribute(false)] 
    private new System.Runtime.Serialization.ExtensionDataObject ExtensionData 
    { 
     get { return base.ExtensionData; } 
     set { base.ExtensionData = value; } 
    } 
} 

如果ExtensionData需求是公共使用這個類的一些功能,您可以使用公共的,而不是私人做同樣的方式,並添加NotMapped屬性是這樣的:

[global::System.ComponentModel.BrowsableAttribute(false), NotMapped()] 
    public new System.Runtime.Serialization.ExtensionDataObject ExtensionData 
    { 
     get { return base.ExtensionData; } 
     set { base.ExtensionData = value; } 
    } 

這方式,除了將NotMapped屬性添加到聲明外,您不會更改任何內容。