我有一个相当简单的场景,我似乎无法获得正确的逻辑。我正在使用带有 POCO 的 WCF 服务来读取数据并将数据写入数据库。我有一个关键字表,其中有一个外键 UserID 链接到 UserProfile 表。我正在添加和修改关键字集合,但是当我尝试在 GetKeywords 方法中包含 UserProfile 然后进行一些更改并调用 StoreKeywords 方法时,我遇到了参照完整性问题。如果我不包含 UserProfiles,我可以添加和更新没有问题。我使用支持 WCF 的 POCO 生成器并修改了 T4 以删除虚拟并使用 FixupCollections。
任何帮助将非常感激。提前致谢。
获取关键字服务:
public class Service : IService
{
public List<Keyword> GetKeywords()
{
var context = new myDBEntities();
var query = from c in context.Keywords
.Include("UserProfile")
select c;
//var query = from c in context.Keywords.Take(100)
// select c;
return query.ToList();
}
调用 GetKeywords 的客户端代码进行一些更改,然后调用 StoreKeywords:
public partial class MainWindow : Window
{
ObservableCollection<Keyword> keylist;
public MainWindow()
{
InitializeComponent();
PopulateGrid();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
myServiceClient client = new myServiceClient();
List<Keyword> updates = new List<Keyword>();
foreach (Keyword keyword in keylist)
{
if (keyword.State == State.Added)
{
keyword.CreationDate = DateTime.Now;
updates.Add(keyword);
}
if (keyword.State == State.Modified)
{
keyword.EditDate = DateTime.Now;
if (keyword.IsVoid == false) keyword.VoidDate = null;
if (keyword.IsVoid == true) keyword.VoidDate = DateTime.Now;
updates.Add(keyword);
}
}
client.StoreKeywords(updates.ToArray());
foreach (var kw in keylist)
{
kw.State = State.Unchanged;
}
PopulateGrid();
gridControl1.RefreshData();
}
private void PopulateGrid()
{
myServiceClient client = new myServiceClient();
keylist = new ObservableCollection<Keyword>(client.GetKeywords());
gridControl1.ItemsSource = keylist;
}
StoreKeywords 服务:
public string StoreKeywords(List<Keyword> keywords)
{
try
{
using (var context = new myDBEntities())
{
context.ContextOptions.LazyLoadingEnabled = false;
foreach (Keyword kw in keywords)
{
context.Keywords.Attach(kw);
context.ObjectStateManager.ChangeObjectState(kw, StateHelpers.GetEquivalentEntityState(kw.State));
}
context.SaveChanges();
return "";
}
}
catch (Exception ex)
{
return ex.Message;
}
}