'无法定义两个对象之间的关系,因为它们附加到不同的ObjectContext对象。' - 错误

时间:2015-10-12 10:23:49

标签: c# entity-framework mvvm

首先,我想提一下,我已经搜索了互联网,找到问题的解决方案,但是我无法解决问题。我对EF很新,所以我不完全了解DBContext或ObjectContexts,因此可能需要进一步说明。我的EF代码首先构建了数据库。

我的情景

我的数据模型中有两个表: enter image description here

下面是我的DriveDB类,其中附有Client_Type(以及为简单起见,我在示例中省略了其他内容)。

public partial class DriveDB : DbContext
{
    public DriveDB()
        : base("name=DriveDB")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    public virtual DbSet<Client_Type> Client_Type { get; set; }
    public virtual DbSet<Entity> Entities { get; set; }
    public virtual DbSet<EntityContact> EntityContacts { get; set; }
    public virtual DbSet<Person> People { get; set; }
}
public class DataAccessService : IDataAccessService
{
    DriveDB MainRepository;
    public DataAccessService()
    {
        MainRepository = new DriveDB();
    }
    public void CommitChanges()
    {
        MainRepository.SaveChanges();
    }
}

我的逻辑是,由于现在附加了Client_Type表,所以我需要做的就是更新这些表,运行.SaveChanges()方法并且两个表都将被更新。但事实并非如此,因为显然他们并不共享ObjectContext。我发现DBContextObjectContext之间存在差异,但我不知道如何克服这个问题。

我试图将Client_Type分离并附加到DriveDB但是我从未找到正确的解决方案。

如何在没有编译器抛出异常的情况下更新数据库?

的Xaml:

<ComboBox Style="{StaticResource DataComboBox}" ItemsSource="{Binding Client_type_list}" SelectedItem="{Binding Record.Client_Type, Mode=TwoWay}" ItemTemplate="{StaticResource Client_typeDataTemplate}"/>

<DataTemplate x:Key="Client_typeDataTemplate">
            <TextBlock Text="{Binding client_type1}"/>
        </DataTemplate>

2 个答案:

答案 0 :(得分:0)

您必须将状态更新为每个表中的每个条目都已修改。这些表是相关的,但它们仍然是DbContext中的单独表。您可以在此处详细了解您的案例:http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/updating-related-data-with-the-entity-framework-in-an-asp-net-mvc-application

答案 1 :(得分:0)

所以对于那些感兴趣的人来说,我找到了解决方案。

ItemSource的{​​{1}}绑定到此属性:

ComboBox

这使得public List<Client_Type> Client_type_list { get { return ServerPxy.GetClientTypes(); } } 不仅无法从ComboBox属性读取SelectedItem值,而且在我尝试使用新值更新数据库时也抛出上述异常。 / p>

我现在有一个属性,只在加载Record时才从数据库中获取值:

UserControl

重申......我相信private List<Client_Type> client_type_list; public List<Client_Type> Client_type_list { get { return client_type_list; } set { client_type_list = value; RaisePropertyChanged("Client_type_list"); } } public void LoadExecute() { Client_type_list = ServerPxy.GetClientTypes(); } 的{​​{1}}必须在SelectedItem 之前设置