首先,我想提一下,我已经搜索了互联网,找到问题的解决方案,但是我无法解决问题。我对EF很新,所以我不完全了解DBContext或ObjectContexts,因此可能需要进一步说明。我的EF代码首先构建了数据库。
我的情景
下面是我的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
。我发现DBContext
和ObjectContext
之间存在差异,但我不知道如何克服这个问题。
我试图将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>
答案 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
之前设置