0

Я пытаюсь обновить EF с 4.x до 6.x (новейшая стабильная с помощью nuget). После некоторой работы приложение работает для извлечения данных, но не для сохранения.
По соображениям производительности мы в основном использовали метод «AttachAsModified» от EF 4.x. В большинстве случаев у нас есть первичный ключ, attach, изменение значений, которые мы хотим обновить и, наконец, сохранить.
EF 6.x не имеет такой метод, поэтому я попытался следующие:Entity Framework 6 AttachAsModified

var data = new CatalogNode 
{ 
    CatalogNodeId = catalogNodeId, 
    UpdatedOn = updatedOn, 
    UpdatedBy = updatedBy, 
}; 

    CatalogNodes.Attach(data); 
    var entry = Entry(data); 
    entry.Property(e => e.UpdatedOn).IsModified = true; 
    entry.Property(e => e.UpdatedBy).IsModified = true; 

К сожалению EF бросает «DbEntityValidationException», который говорит, что некоторые дополнительные свойства необходимы и должны быть установлены.

Edit:
Вот сгенерированный CatalogNodes объект (сеттер включает в себя вызов OnPropertyChanged)

public partial class CatalogNode : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public CatalogNode() 
    { 
     this.CatalogArticles = new HashSet<CatalogArticle>(); 
     this.LocalizedCatalogNodes = new HashSet<LocalizedCatalogNode>(); 
     this.CatalogNodeAttributeValues = new HashSet<CatalogNodeAttributeValue>(); 
     this.CatalogNodeMappings = new HashSet<CatalogNodeMapping>(); 
     this.TranslatedCatalogNodeNames = new HashSet<TranslatedCatalogNodeName>(); 
     this.CatalogNodeMediaAssets = new HashSet<CatalogNodeMediaAsset>(); 
    } 

    private System.Guid _catalognodeid; 
    public System.Guid CatalogNodeId {get;set;} 

    private string _catalognodeuid; 
    public string CatalogNodeUid {get;set;} 

    private System.Guid _catalogid; 
    public System.Guid CatalogId {get;set;} 

    private int _catalognodetype; 
    public int CatalogNodeType {get;set;} 

    private Nullable<System.Guid> _parentid; 
    public Nullable<System.Guid> ParentId {get;set;} 

    private Nullable<System.Guid> _linkid; 
    public Nullable<System.Guid> LinkId {get;set;} 

    private int _sequence; 
    public int Sequence {get;set;} 

    private Nullable<System.Guid> _attributegroupid; 
    public Nullable<System.Guid> AttributeGroupId {get;set;} 

    private string _printcatalogtemplateuid; 
    public string PrintCatalogTemplateUid {get;set;} 

    private bool _printcatalogpagebreak; 
    public bool PrintCatalogPageBreak {get;set;} 

    private System.DateTime _createdon; 
    public System.DateTime CreatedOn {get;set;} 

    private string _createdby; 
    public string CreatedBy {get;set;} 

    private System.DateTime _updatedon; 
    public System.DateTime UpdatedOn {get;set;} 

    private string _updatedby; 
    public string UpdatedBy {get;set;} 


    public virtual AttributeGroup AttributeGroup { get; set; } 
    public virtual Catalog Catalog { get; set; } 
    public virtual ICollection<CatalogArticle> CatalogArticles { get; set; } 
    public virtual ICollection<LocalizedCatalogNode> LocalizedCatalogNodes { get; set; } 
    public virtual ICollection<CatalogNodeAttributeValue> CatalogNodeAttributeValues { get; set; } 
    public virtual CatalogNode LinkedCatalogNode { get; set; } 
    public virtual ICollection<CatalogNodeMapping> CatalogNodeMappings { get; set; } 
    public virtual ICollection<TranslatedCatalogNodeName> TranslatedCatalogNodeNames { get; set; } 
    public virtual ICollection<CatalogNodeMediaAsset> CatalogNodeMediaAssets { get; set; } 

    public void OnPropertyChanged(string propertyName) 
    { 
     if(PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

сообщения об ошибках, которые я получаю, как:.
- «Проверка не для одного или нескольких объектов см Свойство EntityValidationErrors для получения более подробной информации. "
- "Поле" CreatedBy \ "требуется."

Первый вопрос: Где я могу увидеть или установить, какие поля требуются? В настоящее время мы используем первый подход к базе данных.
Второй вопрос: есть ли обходной путь? Полученный в результате запрос обновления не обновляет эти дополнительные свойства. Конечно, я мог бы установить эти дополнительные свойства на некоторые случайные значения и пометить эти свойства как неизменные, но должен быть лучший способ, на который я надеюсь.

Благодарим за помощь!

+0

Пожалуйста, разместите сопоставление EF вашего объекта «CatalogNode» – Hughnited

+0

Можете ли вы опубликовать код отображения EF (если есть)? По умолчанию это будет в классе с именем CatalogNodeMap. У вас есть код в методе DbContext.OnModelCreating? InterchangeFilePath не является частью вашего исходного класса CatalogNode, вы уверены, что InterchangeFilePath является свойством класса CatalogNode? – ranquild

+0

Ошибки были из другого класса, извините за это. Теперь сообщение об ошибке происходит из свойства CreatedBy класса CatlaogNode. Нет кода отображения EF, и нет такого класса, как CatalogNodeMap. – Andre

ответ

1

1) Где я могу увидеть или установить, какие поля необходимы?

Они помечены как не обнуляемые в EDMX файл: EF designer with not nullable property

Или они помечены [обязательно] атрибут:

[Required] 
public string Name { get; set;} 

Или они обозначенные требуется копаться() вызов с Fluent API:

modelBuilder.Entity<Person>().Property(t => t.Name).IsRequired(); 

Или они позволяют теперь нулевое значение необходимо установить:

public int Age { get; set; } 

Например, это позволяет нулевое значение:

public int? Age { get; set; } 

2) есть обходной путь?

Для частичных обновлений единственное обходное решение, которое я знаю, задает некоторые значения нежелательной почты для не измененных свойств, чтобы пройти проверку. Например, давайте обновим возрастное свойство человека с id = 1:

var person = new Person(); 
person.Id = 1; 
person.Name = ""; // not null string to pass validation 
person.Age = 25; 

var entry = context.Entry(person); 
entry.Property(e => e.Age).IsModified = true; 
context.SaveChanges(); 

Важно: Attach() не требуется.

+0

Что делать со свойствами типа string? Я, очевидно, не могу отметить их как NULL, потому что они по умолчанию являются нулевыми. Несмотря на это, структура сущности говорит, что они необходимы. – Andre

+0

@Andre проверить, отмечены ли эти свойства IsRequired() с Fluent API. Это может быть в вашем методе DbContext.OnModelCreating. Или в классах конфигурации в папке Mapping (если EF Power Tools используются для генерации классов). – ranquild

+0

Они не отмечены IsRequired() или в классе конфигурации. В EF 4.x эти свойства не были отмечены как обнуляемые, но это сработало. Я думаю, что старые версии инфраструктуры сущностей просто не выполняли эти проверки. – Andre

0

Я обнаружил, что проверка просто не работает с частичными обновлениями.Одним из решений является переопределить метод ValidateEntity или отключить проверку, установив для ValidateOnSaveEnabled proeprty значение false. Оба они расположены в классе конфигурации db.