2017-09-26 5 views
0

以下のコードはレコードを正常に保存しますが、クライアントは保存しません。私はレコードをDBに保存してもエラーは出ませんが、親クライアントとの関係は作成しません。デバッグ中は、varクライアントに実際にクライアントオブジェクトが含まれていることを確認しました。エンティティフレームワークのコードの最初の更新レコードが親を保存していません

ご協力いただきありがとうございます。とにかくここ

は私のコードです:

using (var context = new TDBContext()) 
     { 
      if (SelectedProject != null) 
      { 
       var client = (from x in context.Clients 
           where x.ID == (Guid) comboClient.SelectedValue 
           select x).FirstOrDefault(); 

       Project project = new Project() 
       { 
        ID = (Guid) SelectedProject, 
        ProjectCode = textProjectCode.Text, 
        Client = client, 
        ProjectStart = dateProjectStart.SelectedDate, 
        Active = checkActive.IsChecked 
       }; 

       context.Projects.Attach(project);  
       context.Entry(project).State = EntityState.Modified; 
       context.SaveChanges(); 
      } 
      else 
      { 
       MessageBox.Show("Project ID not loaded!", "Error!", MessageBoxButton.OK, MessageBoxImage.Error); 
      } 
     } 

プロジェクトエンティティ:

public Project() 
    { 

    } 

    [Key] 
    public Guid ID { get; set; }  
    public string ProjectCode { get; set; } 
    public Client Client { get; set; } 
    public DateTime? ProjectStart { get; set; } 
    public bool? Active { get; set; } 

クライアントエンティティ:

public Client() 
    { 

    } 
    [Key] 
    public Guid ID { get; set; } 
    public string ClientName { get; set; } 
    public byte[] ClientLogo { get; set; } 

    public ICollection<Project> Projects { get; set; } 
+0

私はクライアントを取得してその子コレクションを更新します。しかし、Project.Clientのエンティティ状態も同様に変更するとうまくいくでしょう。また、私は親レコードの存在をカウントしているときに 'First()'から 'FirstOrDefault()'を優先します。私は少なくともそれがnullでないことを確認するだろう。 –

答えて

0

編集(最終的にはそれが働いてしまった):

私は、クライアントを更新するための別の方法を作成しました。私はこれを主なセーブ方法から呼びます。これは毎回動作します。私はこれをよりよく行うことができます確信している(すなわち、同じ方法ですべて):

private void SaveClient() 
    { 
     using (var context = new PDBContext()) 
     { 
      var client = (from x in context.Clients 
          where x.ID == (Guid) comboClient.SelectedValue 
          select x).FirstOrDefault(); 

      var project = (from x in context.Projects 
          where x.ID == SelectedProject 
          select x).FirstOrDefault(); 

      project.Client = client; 

      context.Projects.Attach(project); 

      context.Entry(project).State = EntityState.Modified; 

      context.SaveChanges(); 
     } 

     PopulateClientCombo(); 
    } 
0

あなたがいないだけのClientID列を割り当てる必要がありますクライアント参照。 EFは、ClientIdが存在し、クライアントナビゲーションプロパティと異なるIDを持っているかどうかをチェックするのに十分スマートですが、IDが空白の場合、そのClientナビゲーションプロパティは完全に無視されます。

編集

ああ、その後、代わりに変更にそれを変更するのでcontext.Projects.Add(プロジェクト)を呼び出します。

+0

試行されたClient.ID = client.IDが動作しません。私は "Invalid initializer member declarator"を取得します。これを行う正しい方法は何ですか? – Salbrox

+0

プロジェクトエンティティ自体のクライアントIDプロパティ。つまり、project.ClientId = client.Idです。 –

+0

私はクライアントIDプロパティを持っていません私は、プロジェクトの親エンティティであるクライアントを持っています。彼らは1-nの関係にあります。 – Salbrox

0

私はEFの使用についてとてもよく分からないが、私はこの問題のために打撃を与えるしようとするでしょう。これはあなたとは全く異なるアプローチであることに注意してください。要するに、クライアントのIDを作成/取得し、追加する新しいProjectオブジェクトに追加します。

  1. もう1つのプロパティをプロジェクトエンティティ:public Guid ClientId { get; set; }に追加してください。これは、public Client Client { get; set; }と並んでいます。移行を適用すると、ProjectテーブルにClient(1対多の関係ではありませんか?)を参照するClientIdが追加されます。

  2. 移行を適用し、テーブル自体に参照があることを確認します。

  3. 新しいプロジェクトを作成するときにClientIdを追加する方法では、これで十分です。

    Project project = new Project() 
    { 
        ID = (Guid) SelectedProject, 
        ProjectCode = textProjectCode.Text, 
        ClientId = (Guid)comboClient.SelectedValue, // Your client's Guid. Make sure this record exists in the database. 
        ProjectStart = dateProjectStart.SelectedDate, 
        Active = checkActive.IsChecked 
    }; 
    

これは、私は通常私のプロジェクトで何をすべきかです。 クエリを使用すると、データが読み込まれ、EntityFrameworkにはそのためのメソッドがあります。参照:Loading Related Data

関連する問題