3

Windows Phone 用のアプリケーションを作成していますが、データベースの処理に関する問題に直面しています。設計されたデータベースの一部は (おおよそ) 次のようになります。ユーザーの範囲内でのみ一意です。

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();

その結果、各アイテムが所有者プロパティとして適切なユーザーオブジェクトを持つアカウントの正しいリストを取得します。

しかし、次のようにデータコンテキストからユーザーオブジェクトを取得しようとしている場合:

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();)

デバッグ ウォッチの Accounts エンティティ セットには、次のプロパティ値があります。

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

ここのコンテンツのため: Windows Phone Mango Local Database(SQL CE): [Association] 属性また、 [Association(Name = "FK_USER_ACCOUNTS")]属性 で Accounts プロパティをマークして、datacontext に関連付けFK_USER_ACCOUNTSに関連していることを知らせる必要があります。 . しかし、この関連付けで ThisKey = " ID ", OtherKey = " OWNER_ID " を設定すると、データベースの作成中に例外が発生し、プライマリ kay 全体 ( ACCOUNT.ID および ACCOUNT.OWNERID ) が関連付けの一部である必要があることが通知されます。ただし、主キーの一部 (ACCOUNT.ID) だけではありません。ユーザー側でそのような関連付けを追加できれば、問題は解決すると思います。

Accounts エンティティ セットが読み込まれた User エンティティを取得する方法を提案できる人はいますか? 前もって感謝します。ドミトロ。

4

1 に答える 1

0

.Include() を使用してみてください。お気に入り:

var user = (from u in dataContext.Users.Include("Accounts")
          where u.ID.ToUpper() == userName.ToUpper()
          select u).
                    SingleOrDefault();
于 2014-03-21T19:47:03.240 に答える