WCF ExtensionDataObject导致Entity Framework 4.2无法创建数据库

时间:2011-11-09 19:07:04

标签: .net wcf entity-framework-4

我正在尝试使用Entity Framework 4.2和对象优先创建SQL CE 4.0数据库。

我的类是在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;
        }
    }

这会导致EF从JobType类创建表时崩溃,并出现以下错误:

没有为Set JobTypes

中的属性JobType.ExtensionData指定映射

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

在数据上下文定义中,重写OnModelCreating以忽略extensiondata属性所来自的类:

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

答案 1 :(得分:0)

NotMapped属性上添加ExtensionData属性以将其从映射中排除。你不能坚持这个领域。

答案 2 :(得分:0)

JobType类中,您可以通过将其重新声明为ExtensionData来隐藏继承的private属性。为此,您需要在new之后添加关键字private。这告诉编译器你想要从基类隐藏属性,而是使用这个声明。

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,您可以使用public而不是private以相同的方式执行此操作,并添加NotMapped属性,如下所示:

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

这样,除了在声明中添加NotMapped属性外,您不会更改任何内容。