【问题标题】:WCF ExtensionDataObject causes Entity Framework 4.2 to fail creating databaseWCF ExtensionDataObject 导致 Entity Framework 4.2 无法创建数据库
【发布时间】:2012-04-13 20:21:22
【问题描述】:

我正在尝试首先使用实体​​框架 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 指定映射

我该如何解决这个问题?

【问题讨论】:

    标签: .net wcf entity-framework-4


    【解决方案1】:

    在您的数据上下文定义中,覆盖 OnModelCreating 以忽略 extensiondata 属性来自的类:

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

    【讨论】:

    • 有趣。会检查一下。
    【解决方案2】:

    ExtensionData 属性上添加NotMapped 属性以将其从映射中排除。您不能保留此字段。

    【讨论】:

    • 您将如何以及在何处添加 NotMapped 属性?
    • 在您不想映射的属性上 - 在您的情况下是 ExtensionData
    • 这不是我创建的属性 - 它是在代理中自动创建的。我想摆脱财产。
    【解决方案3】:

    JobType 类中,您可以通过将继承的ExtensionData 属性重新声明为private 来隐藏它。为此,您需要在private 之后包含关键字new rigth。这告诉编译器您要对基类隐藏属性,并改用此声明。

    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 属性添加到声明中之外,您不会更改任何内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-28
      • 1970-01-01
      • 2015-01-15
      相关资源
      最近更新 更多