3

私はWindows Phone向けのアプリケーションを作成しており、データベース処理に関連する問題に直面しています。 2つのテーブル USER {ID} - IDはプライマリキー アカウント{ID、OWNERID、BALANCE} - IDとOWNERIDはコンポジット主キーです。これはIDを意味しますユーザーのアカウントは、ユーザーの範囲内で一意です。WP7:エンティティセットの読み込み。 1対多の関係 - 複合主キーケース

account.IDはユーザーによって定義されているはずであり、複数のユーザーが同じIDでアカウントを定義する可能性が非常に高いため、最後の表の複合主キーが使用されていました。

だからC#で、それは次のようになります。ここでは

[Table] 
public class User 
{ 
    [Column(IsVersion = true)] 
    private Binary _version; 

    public User() 
    { 
     _accountsRef = new EntitySet<Account>(OnAccountAdded, OnAccountRemoved); 
    } 

    private string _id; 
    [Column(IsPrimaryKey = true, IsDbGenerated = false, CanBeNull = false, Storage = "_id")] 
    public string ID { 
     get { return _id; } 
     set 
     { 
      if(string.Equals(value, ID, StringComparison.InvariantCultureIgnoreCase)) 
       return; 
      RaisePropertyChanging("ID"); 
      _id = value; 
      RaisePropertyChanged("ID"); 
     } 
    } 

    private EntitySet<Account> _accountsRef; 

    public EntitySet<Account> Accounts 
    { 
     get { return _accountsRef; } 
    } 

    private void OnAccountAdded(Account account) 
    { 
     account.Owner = this; 
    } 

    private void OnAccountRemoved(Account account) 
    { 
     account.Owner = null; 
    } 

    .... 
} 

[Table] 
public class Account : PropertyChangingNotificator 
{ 
    [Column(IsVersion = true)] 
    private Binary _version; 

    private string _ownerId; 
    [Column(IsPrimaryKey = true, CanBeNull = false)] 
    public string OWNER_ID 
    { 
     get { return _ownerId; } 
     set 
     { 
      if (value == OWNER_ID) 
       return; 
      RaisePropertyChanging("OWNER_ID"); 
      _ownerId = value; 
      RaisePropertyChanged("OWNER_ID"); 
     } 
    } 

    private EntityRef<User> _ownerRef; 
    [Association(Name = "FK_USER_ACCOUNTS", ThisKey = "OWNER_ID", OtherKey = "ID", Storage = "_ownerRef", IsForeignKey = true)] 
    public User Owner { 
     get { return _ownerRef.Entity; } 
     set 
     { 
      User previousValue = _ownerRef.Entity; 
      if(previousValue==value)// && !_ownerRef.HasLoadedOrAssignedValue) 
      { 
       return; 
      } 
      if(previousValue!=null) 
      { 
       _ownerRef.Entity = null; 
       previousValue.Accounts.Remove(this); 
      } 
      RaisePropertyChanging("Owner"); 
      _ownerRef.Entity = value; 
      if(value!=null) 
      { 
       value.Accounts.Add(this); 
       OWNER_ID = value.ID; 
      } 
      else 
      { 
       OWNER_ID = string.Empty; 
      } 
      RaisePropertyChanged("Owner"); 
     } 
    } 
} 

は所与のIDを持つユーザーのアカウントを要求するクエリです:

var accounts = from a in dataContext.Accounts 
       where a.OWNER_ID == userName 
       select a; 
List<Account> accoutsList = accounts.ToList(); 

結果では、私はアカウントの正しいリストを取得します各項目にはOwnerプロパティとして適切なUserオブジェクトがあります。

しかし、場合には、私はこのようにDataContextからユーザーオブジェクトを取得しようとしている:

HasAssignedValues   == false; 
    HasLoadedOrAssignedValues == false; 
    HasLoadedValues   == false; 
    HasSource     == false; 
    HasValues     == true; 
    IsDeffered    == false; 
    IsLoaded     == false; 

によりここコンテンツへ::デバッグウォッチで

var user = (from u in dataContext.Users 
       where u.ID.ToUpper() == userName.ToUpper() 
       select u). 
         SingleOrDefault(); 

property user.Accounts has EntitySet without loaded values (also even after call user.Accounts.Load();) 

は、エンティティセットは、次のプロパティ値を持つアカウントWindows Phone Mango Local Database(SQL CE): [Association] attribute また、アカウントのプロパティに[アソシエーション(名前= "FK_USER_ACCOUNTS")]属性をマークする必要があります。datacontext t oそれが関連FK_USER_ACCOUNTSに関連していることを知っています。 しかし、私は=「IDを」ThisKeyを設定した場合、OtherKey =「OWNER_ID」この協会に - 私が伝えデータベース作成時に例外を取得その全体のプライマリ・ケイ(ACCOUNT.IDとACCOUNT.OWNERID )は、主キー(ACCOUNT.ID)の一部だけでなく、関連付けの一部である必要があります。ユーザー側でそのような関連付けを追加することが可能だった場合は、問題は解決されると思います。

誰かが、読み込まれたアカウントエンティティセットを持つユーザーエンティティを取得する方法を提案できますか? ありがとうございます。 Dmytro。

答えて

0

.Include()を使用してください。 Like:

var user = (from u in dataContext.Users.Include("Accounts") 
      where u.ID.ToUpper() == userName.ToUpper() 
      select u). 
        SingleOrDefault();