我正在尝试使用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指定映射我该如何解决这个问题?
答案 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
属性外,您不会更改任何内容。