возникает System.InvalidOperationException: в моем WPF приложении
Я пишу Wpf приложение следуя паттерну MVVM у меня есть DataGrid для просмотра данных в моей View, а также 4 TextBox 1 Combobox и Button для добавления новых данных, я использую Entity Framework core чтобы проводить CRUD с данными вот мои: Combobox:
<ComboBox ItemsSource="{Binding NewWorker.JobTitles}"
SelectedItem="{Binding NewWorker.JobTitle, UpdateSourceTrigger=PropertyChanged}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Title}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
Worker class:
public class Worker : ObservableObject
{
private int _id;
private string _name;
private string _secondName;
private int _age;
private string _email;
private List<JobTitle> _jobTitles;
private int _jobTitleId;
private JobTitle? _jobTitle;
public int Id {
get => _id;
set => Set(ref _id, value);
}
public string Name
{
get => _name;
set => Set(ref _name, value);
}
[NotMapped]
public List<JobTitle> JobTitles
{
get => _jobTitles;
set => Set(ref _jobTitles, value);
}
public int JobTitleId
{
get => _jobTitleId;
set => Set(ref _jobTitleId, value);
}
public JobTitle? JobTitle
{
get => _jobTitle;
set => Set(ref _jobTitle, value);
}
}
JobTitle class:
public class JobTitle : ObservableObject
{
private int _id;
private string _title;
private ObservableCollection<Worker> _workers;
public int Id
{
get => _id;
set => Set(ref _id, value);
}
public string Title
{
get => _title;
set => Set(ref _title, value);
}
public ObservableCollection<Worker> Workers
{
get => _workers;
set => Set(ref _workers, value);
}
public override bool Equals(object? obj)
{
return (obj==null || obj is not JobTitle) ? false : Title == (obj as JobTitle).Title;
}
public override int GetHashCode()
{
return Title.GetHashCode();
}
}
}
ViewModel for View with Combobox:
public class WorkersDataTableVM : ObservableObject
{
private WorkerRepository _workerRepository;
private JobTitleRepository _jobTitleRepository;
private ObservableCollection<Worker> _workers;
private Worker _newWorker;
public ObservableCollection<Worker> Workers
{
get => _workers;
set => Set(ref _workers, value);
}
public Worker NewWorker
{
get => _newWorker;
set => Set(ref _newWorker, value);
}
public RelayCommand AddWorkerCommand { get; set; }
public WorkersDataTableVM()
{
_workerRepository = new WorkerRepository();
_jobTitleRepository = new JobTitleRepository();
Workers = new ObservableCollection<Worker>(_workerRepository.GetAllWorkers());
NewWorker = new Worker();
LoadData();
AddWorkerCommand = new RelayCommand(AddWorker,CanAddWorker);
}
private bool CanAddWorker(object arg)
{
bool flag = false;
if (NewWorker.Name != default(string) && NewWorker.SecondName != default(string) && NewWorker.Age != default(int) && NewWorker.JobTitleId != default(int))
{
flag = true;
}
return flag;
}
private void AddWorker(object obj)
{
Workers.Add(NewWorker);
_workerRepository.AddWorker(NewWorker);
NewWorker = new();
}
private void LoadData()
{
var workers = _workerRepository.GetAllWorkers();
var jobTitle = _jobTitleRepository.GetAllJopTitles();
Workers = new ObservableCollection<Worker>(workers);
foreach (Worker worker in Workers)
{
worker.JobTitles = jobTitle;
}
NewWorker.JobTitles = jobTitle;
}
}
я вообще не понимаю из-за чего вылетает исключение:
System.InvalidOperationException: 'The instance of entity type 'JobTitle' cannot be tracked because another instance with the same key value for {'Id'} is already being tracked. When attaching existing entities, ensure that only one entity instance with a given key value is attached. Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see the conflicting key values.'
я ради теста написал маленькое консольное приложение которое (по моему мнению) делает абсолютно тоже самое и оно работает:
public class User
{
public int Id { get; set; }
public string? Name { get; set; }
[NotMapped]
public List<Company> Companies { get; set; }
public int CompanyId { get; set; }
public Company? Company { get; set; }
}
public class Company
{
public int Id { get; set; }
public string? Name { get; set; }
public List<User> Users { get; set; } = new();
public override bool Equals(object? obj)
{
return (obj == null || obj is not Company) ? false : Name == (obj as Company).Name;
}
public override int GetHashCode()
{
return Name.GetHashCode();
}
}
public class Program
{
static void Main(string[] args)
{
using (ApplicationContext db = new ApplicationContext())
{
User user = new User();
user.Companies = db.Companies.ToList();
user.Name = "Name";
user.Company = user.Companies[0];
db.Users.Add(user);
db.SaveChanges();
}
}
Проблема вряд ли в моем Combobox и привязке к нему, я попробовал в коде создать новый объект, но все равно возникает это исключение.
P.S. Исключение не возникает при передаче JobTitle по Id, но я не очень хочу использовать такой вариант так как тогда придется придумывать лишние конвертеры из ID в SelectedID