【问题标题】:Entity Framework UpdateException relationships in Added and Deleted states添加和删​​除状态下的实体框架 UpdateException 关系
【发布时间】:2010-03-18 15:54:46
【问题描述】:

我有一张植物和信息表。

植物有一个 ID、名称、...、MainInformationID

信息具有 ID、标题、...、PlantID

一个工厂可以有很多信息,但只有一个 MainInformation。信息只能有一种植物。

我有一个 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 的方式等等......(我是一个初学者所以我真的不知道应该如何正确使用)

【问题讨论】:

    标签: c# .net wpf entity-framework updateexception


    【解决方案1】:

    错误提示您缺少必填字段。我猜是MainInformation。你可以这样做:

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

    是的,使用静态上下文是个坏主意。有一些discussion on how to choose an appropriate lifetime in this post

    【讨论】:

    • 但我没有添加植物,我只是更改其主要信息。它全部绑定到窗口,所以我认为没有任何遗漏,我尝试查看(查看在保存更改之前是否有对任何内容的空引用)并且我可以看到没有任何遗漏......你能给我建议吗关于如何检查是否缺少某些东西?
    • 哦,我明白了。那么,您的绑定可能是错误的。看起来链接控件导致插入而不是更新,可能是因为未检测到密钥?不过,我不是这方面的专家。您是否尝试过使用实体数据源?它应该会为你解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多