Windows phone 7 WP7:实体集加载。一对多关系-复合主键情况

Windows phone 7 WP7:实体集加载。一对多关系-复合主键情况,windows-phone-7,database-design,relational-database,windows-phone-7.1,entity-relationship,Windows Phone 7,Database Design,Relational Database,Windows Phone 7.1,Entity Relationship,我正在为Windows Phone创建应用程序,遇到了一个与数据库处理相关的问题。 设计数据库的一部分(近似)如下所示: 两张桌子 用户{ID}-ID是主键 帐户{ID,OWNERID,BALANCE}-ID和OWNERID-是一个复合主键,这意味着用户帐户的ID仅在用户范围内是唯一的 上一个表中的复合主键是要使用的,因为account.ID应该由用户定义,并且多个用户使用相同标识定义帐户的可能性很大 因此,在C#中,它看起来像下一个: [Table] public class User {

我正在为Windows Phone创建应用程序,遇到了一个与数据库处理相关的问题。 设计数据库的一部分(近似)如下所示: 两张桌子 用户{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");
        }
    }
}
在调试监视帐户中,实体集具有下一个属性值:

   HasAssignedValues         == false;
   HasLoadedOrAssignedValues == false;
   HasLoadedValues           == false;
   HasSource                 == false;
   HasValues                 == true;
   IsDeffered                == false;
   IsLoaded                  == false;
由于此处的内容: 我还必须用[Association(Name=“FK_USER_Accounts”)]属性标记Accounts属性,以便让datacontext知道它与关联FK_USER_Accounts相关。 但是如果我在这个关联中设置ThisKey=“ID”,OtherKey=“OWNER\u ID”,我在数据库创建过程中会遇到一个异常,这表明整个主键(ACCOUNT.ID和ACCOUNT.OWNERID)应该是关联的一部分,而不仅仅是主键(ACCOUNT.ID)的一部分。若有可能在用户端添加这样的关联——我想,这个问题就解决了

你们中的任何人都可以建议如何获取已加载帐户实体集的用户实体吗? 提前谢谢。 Dmytro.

尝试使用.Include()。比如:

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;
var user = (from u in dataContext.Users.Include("Accounts")
          where u.ID.ToUpper() == userName.ToUpper()
          select u).
                    SingleOrDefault();