Здравствуйте, у меня странная проблема здесь.У меня есть модель Project
, у которой есть внешний ключ к модели Company
.Дело в том, что когда я присоединяю свое свойство Project
для его обновления, оно обновляет все остальные примитивные поля, кроме Company.
Модель Project
выглядит следующим образом:
public class Project
{
[Key]
public int ID { get; set; }
[Index(IsUnique = true)]
public string Name { get; set; }
public virtual Company Company { get; set; }
public bool ExportProjectName { get; set; }
public DateTime CreatedAt { get; set; }
}
Тогда, что я делаю, у меня есть ProjectsViewModel
, который получает все проекты из базы данных.Затем я обертываю каждый из них в ProjectViewModel
, который выставляет некоторые поля Project
, а также имеет метод сохранения.Я думаю, что реализация ProjectsViewModel
может быть не такой важной, поэтому я вставлю только две строки, которые заполняют ProjectViewModel
s:
var projects = dbcontext.Projects.Include(x => x.Company).ToList().Select(x => new ProjectViewModel(x));
this.ListOfProjects = new ObservableCollection<ProjectViewModel>(projects);
Тогда у меня будет ProjectViewModel
.Взгляните на метод SaveProject
:
public class ProjectViewModel : INotifyPropertyChanged
{
private Project _project;
public Project Project
{
get { return _project; }
set
{
_project = value;
NotifyPropertyChanged("Project");
}
}
public int ID
{
get { return Project.ID; }
set
{
Project.ID = value;
NotifyPropertyChanged("ID");
}
}
public string Name
{
get { return Project.Name; }
set
{
Project.Name = value;
NotifyPropertyChanged("Name");
}
}
public Company Company
{
get { return Project.Company; }
set
{
Project.Company = value;
NotifyPropertyChanged("Company");
}
}
public ProjectViewModel(Project project)
{
this.Project = project;
}
public void SaveProject()
{
using (DbContext dbcontext = new DbContext())
{
// At this state this.Project and this.Company exist in the database
dbcontext.Companies.Attach(this.Company);
dbcontext.Projects.Attach(this.Project);
dbcontext.Entry(this.Project).State = EntityState.Modified;
dbcontext.SaveChanges();
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(String info)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info));
}
}
И все.У меня есть SaveProject
, привязанный к команде, которую я просто запускаю.
И тогда в журналах я вижу только такой запрос:
Opened connection at 08/12/2018 17:47:21 +01:00
Started transaction at 08/12/2018 17:47:21 +01:00
UPDATE "public"."Projects" SET "Name"=@p_0,"ExportProjectName"=@p_1,"CreatedAt"=@p_2 WHERE "ID" = @p_3
Так что все свойства есть,кроме компании.Если это важно - я использую PostgreSQL с NpgSql.Я видел много вопросов о SO в связи с тем, что связанный объект не обновлялся сам по себе, но я не смог найти ни одного вопроса, где связь была бы только нарушена.Надеюсь, что кто-то может помочь!
РЕДАКТИРОВАТЬ: Кстати, приведенный ниже код будет работать, но я не хочу назначать все свойства самостоятельно и хотел бы избежать получения объекта из БД еще раз.И я хочу знать, почему отношение не обновляется в первом случае, так как оно не имеет смысла для меня.
dbcontext.Companies.Attach(this.Company);
var p = dbcontext.Projects.Single(x => x.ID == this.ID);
p.Name = this.Name;
p.Company = this.Company;
dbcontext.SaveChanges();