WCF ExtensionDataObject вызывает сбой при создании базы данных Entity Framework 4.2 - PullRequest
2 голосов
/ 09 ноября 2011

Я пытаюсь создать базу данных SQL CE 4.0, используя Entity Framework 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;
        }
    }

Это приводит к сбою EF при созданиитаблица из класса JobType со следующей ошибкой:

Не указано сопоставление для свойств JobType.ExtensionData в Set JobTypes

Как обойти это?

Ответы [ 3 ]

3 голосов
/ 27 января 2012

В определении контекста данных переопределите OnModelCreating, чтобы игнорировать класс, из которого происходит свойство extensiondata:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Ignore<System.Runtime.Serialization.ExtensionDataObject>();
    base.OnModelCreating(modelBuilder);
}
0 голосов
/ 13 апреля 2012

В классе JobType вы можете скрыть унаследованное свойство ExtensionData, повторно обозначив его как private.Для этого вам нужно включить ключевое слово new rigth после 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 в объявление.

0 голосов
/ 10 ноября 2011

Добавить NotMapped атрибут к свойству ExtensionData, чтобы исключить его из сопоставления.Вы не можете сохранить это поле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...