2

正しいロジックを取得できないように見えるかなり単純なシナリオがあります。POCO で WCF サービスを使用して、データベースのデータを読み書きしています。UserProfile テーブルにリンクされた外部キー UserID を持つキーワード テーブルがあります。キーワード コレクションを追加および変更していますが、UserProfile を GetKeywords メソッドに含めてから変更を加えて StoreKeywords メソッドを呼び出そうとすると、参照整合性の問題が発生します。UserProfiles を含めなくても、問題なく追加および更新できます。WCF をサポートする POCO ジェネレーターを使用し、T4 を変更して仮想を削除し、FixupCollections を使用しました。

どんな助けでも大歓迎です。前もって感謝します。

GetKeywords サービス:

    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;
        }

    }
4

1 に答える 1

0

インターネットを検索した後、私はここで私の質問に対する答えを見つけましたが、それは私にはまったく明らかではありませんでした. マージを追跡しようとしていたため、問題は GetKeyword() メソッドにありました。新しい GetKeywords() メソッド:

public List<Keyword> GetKeywords()
    {
        var context = new InstanexDBEntities();
        context.Keywords.MergeOption = MergeOption.NoTracking; 

        var query = from c in context.Keywords
                        .Include("UserProfile").Take(100)
                    select c;

        return query.ToList();


    }
于 2012-09-26T16:34:35.853 に答える