Я пытаюсь обновить 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 \ "требуется."
Первый вопрос: Где я могу увидеть или установить, какие поля требуются? В настоящее время мы используем первый подход к базе данных.
Второй вопрос: есть ли обходной путь? Полученный в результате запрос обновления не обновляет эти дополнительные свойства. Конечно, я мог бы установить эти дополнительные свойства на некоторые случайные значения и пометить эти свойства как неизменные, но должен быть лучший способ, на который я надеюсь.
Благодарим за помощь!
Пожалуйста, разместите сопоставление EF вашего объекта «CatalogNode» – Hughnited
Можете ли вы опубликовать код отображения EF (если есть)? По умолчанию это будет в классе с именем CatalogNodeMap. У вас есть код в методе DbContext.OnModelCreating? InterchangeFilePath не является частью вашего исходного класса CatalogNode, вы уверены, что InterchangeFilePath является свойством класса CatalogNode? – ranquild
Ошибки были из другого класса, извините за это. Теперь сообщение об ошибке происходит из свойства CreatedBy класса CatlaogNode. Нет кода отображения EF, и нет такого класса, как CatalogNodeMap. – Andre