Entity Framework 6 не обновляет отношение внешнего ключа - PullRequest
0 голосов
/ 08 декабря 2018

Здравствуйте, у меня странная проблема здесь.У меня есть модель 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();
...