Entity Framework UpdateException отношения в добавленном и удаленном состояниях - PullRequest
1 голос
/ 18 марта 2010

У меня есть таблица растений и информации.

Растения имеют идентификатор, имя, ..., MainInformationID

Информация имеет идентификатор, название, ..., PlantID

На одном растении может быть много информации, но только одна основная информация. Информация может иметь только одно растение.

У меня есть класс ViewModel, который содержит наблюдаемые коллекции растений и информацию, привязанную к окну.

Когда я пытаюсь изменить основную информацию о растении. Я получаю эту ошибку:

Связь из набора ассоциаций 'FK_Plants_Information' находится в состоянии «Добавлено». Учитывая ограничения множественности, соответствующая «Информация» также должна находиться в состоянии «Добавлено».

Если я выбираю информацию, которая не используется каким-либо растением, она говорит о состоянии «Добавлен», а если я выбираю ту, которая используется, она говорит о состоянии «Удалено».

**class PlantsViewModel : ViewModelBase
{
    private DAL _dal = new DAL();

    private ObservableCollection<Plant> _plants = new ObservableCollection<Plant>();

    public ObservableCollection<Plant> Plants
    {
        get { return _plants; }
        set 
        { 
            _plants = value;
            _OnPropertyChanged("Plants");
        }
    }

    private Plant _selectedPlant;

    public Plant SelectedPlant
    {
        get { return _selectedPlant; }
        set 
        {
            _selectedPlant = value;
            _OnPropertyChanged("SelectedPlant");
        }
    }

    private ObservableCollection<Information> _information = new ObservableCollection<Information>();

    public ObservableCollection<Information> Information
    {
        get { return _information; }
        set 
        { 
            _information = value;
            _OnPropertyChanged("Information");
        }
    }
 }

И окно:

<TextBox Grid.Column="1" Grid.Row="0" Width="150" Text="{Binding Path=SelectedPlant.LatinName}" />
            <TextBox Grid.Column="1" Grid.Row="1" Width="150" Text="{Binding Path=SelectedPlant.LocalName}" />
            <TextBox Grid.Column="1" Grid.Row="2" Width="150" Text="{Binding Path=SelectedPlant.CycleTime}" />
            <ComboBox Grid.Column="1" Grid.Row="3" Width="150" ItemsSource="{Binding Path=Information}"
                      DisplayMemberPath="Title"
                      SelectedValue="{Binding Path=SelectedPlant.MainInformation, Mode=TwoWay}" />

DAL выглядит следующим образом.

    public class DAL { 
    private static Entities _context = new Entities();

    public void SaveChanges()
    {
        _context.SaveChanges();
    }
    public List<Plant> GetAllPlants()
    {
        return _context.Plants.ToList();
    }

    public void AddNewPlant(Plant plant)
    {
        _context.Plants.AddObject(plant);
    }

    public void DeletePlant(Plant plant)
    {
        _context.DeleteObject(plant);
    } 
    }

Также, пожалуйста, скажите мне, есть ли здесь что-то, что не кажется хорошей идеей (например, наличие статического контекста, способ подключения моей viewModel к dal и т. Д. (Я новичок) так что я не знаю, как его правильно использовать)

1 Ответ

1 голос
/ 18 марта 2010

Ошибка говорит о том, что у вас отсутствует обязательное поле. Я предполагаю, что это MainInformation. Вы можете сделать что-то вроде:

Dal.AddPlant(new Plant { MainInformation = new Information() });

Да, плохая идея использовать статический контекст. В этом посте обсуждается, как выбрать подходящее время жизни .

...