我正在为Windows Phone创建应用程序并遇到与数据库处理相关的问题。 设计数据库的一部分(大约)看起来像: 两张桌子 USER {ID} - ID是主键 帐户{ID,OWNERID,BALANCE} - ID和OWNERID - 是一个复合主键,这意味着用户帐户的ID仅在用户范围内是唯一的。
最后一个表中的复合主键是要使用的,因为account.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();
在结果中,我得到正确的帐户列表,其中每个项目都有适当的User对象作为所有者属性。
但是如果我试图从datacontext获取用户对象,请执行以下操作:
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();)
在调试监视帐户中,实体集具有下一个属性值:
HasAssignedValues == false;
HasLoadedOrAssignedValues == false;
HasLoadedValues == false;
HasSource == false;
HasValues == true;
IsDeffered == false;
IsLoaded == false;
由于此处的内容: Windows Phone Mango Local Database(SQL CE): [Association] attribute 我还必须使用 [Association(Name =“FK_USER_ACCOUNTS”)] 属性标记Accounts属性,让datacontext知道它与关联 FK_USER_ACCOUNTS相关。 但是如果我在这个关联中设置ThisKey =“ ID ”,OtherKey =“ OWNER_ID ” - 我在数据库创建期间得到一个异常,它告诉整个主要的kay(< strong> ACCOUNT.ID和ACCOUNT.OWNERID )应该是关联的一部分,但不仅是主键的一部分(即ACCOUNT.ID)。如果可以在用户端添加这样的关联 - 我猜,问题将会解决。
您是否可以建议如何使用已加载的帐户实体设置获取用户实体? 提前致谢。 德米特罗。
答案 0 :(得分:0)
尝试使用.Include()。像:
var user = (from u in dataContext.Users.Include("Accounts")
where u.ID.ToUpper() == userName.ToUpper()
select u).
SingleOrDefault();