私は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。