2

わかりました、私はこれが何百万回も尋ねられることを知っています、しかし私はまだ実用的な解決策を見つけることができないようです。うまくいけば、私は何かが足りないだけです。Silverlightでエンティティを使用して、RIAを介して、DBに多対多のテーブル構造があります。

[System] - [SystemUsers] - [Users] 

ブリッジテーブルには2つのIDがあるため、当然のことながら、エンティティはそれをモデルに含めません。

RIAは多対多の関係を好まないことを知っているので、コレクションにAssociation属性タグを追加し、少なくともクライアント側でコレクションプロパティを表示できるようになりました。

[Association("DMSSystem_Users", "DMSSystemId", "UserId")]
[Include]
[Composition]
public EntityCollection<Users> Users { get; set; }

私のドメインサービスでは、ユーザーを含めてみました。

public IQueryable<DMSSystem> GetSystem()
{
    return this.ObjectContext.DMSSystem.Include("Users");
}

クライアント側のユーザーを取得することはありませんユーザーを教え込んでクライアントに送信するために、他に欠けているものはありますか?

4

3 に答える 3

1

Entity Frameworkはわかりませんが、NHibernateを使用したRIAでこれがどのように機能するかを次に示します...

私のモデルはUsers - UserRoleGrant - Roleです。モデルへの変換は頭の中で行う必要があります。

次のコードの重要な部分は...モデルに正しい関連付け名があることを確認し、関連付けに正しいプロパティ名が設定されていることを確認し、Userプロパティを設定するときにUserRoleAssociationにUserIDプロパティを設定します。このIDを設定しないと、assocationプロパティを介して関連エンティティにアクセスできなくなります。

おそらくComposition属性も必要ありませんが、これを読んで調べることができます... http://ria.feedables.com/story/4583193/Composition-Support-in-RIA-Services

public class User 
{
    ...snip...
    [Include]
    [Association("UserToRoleAssociation", "Id", "UserId", IsForeignKey = false)]
    public virtual IList<UserRoleAssociation> RoleGrants
    { 
        get
        {
            return this.roleGrants;
        }
    }
}

public class UserRoleAssociation 
{
    /// <summary>
    /// Backing field for User
    /// </summary>
    private User user;

    /// <summary>
    /// Gets or sets the id.
    /// </summary>
    /// <value>The relationships id.</value>
    [Key]
    public virtual long Id { get; set; }

    /// <summary>
    /// Gets or sets the user id.
    /// </summary>
    /// <value>The assigned users id.</value>
    public virtual long UserId { get; set; }

    /// <summary>
    /// Gets or sets the user.
    /// [Association("UserRoleGrants", "UserId", "Id", IsForeignKey = false)]
    /// </summary>
    /// <value>The user who has been granted this operation.</value>
    [Include]
    [Association("UserToRoleAssociation", "UserId", "Id", IsForeignKey = true)]
    public virtual User User
    {
        get
        {
            return this.user;
        }

        set
        {
            this.user = value;

            if (value != null)
            {
                this.UserId = value.Id;
            }
        }
    }
}
于 2011-03-22T14:10:30.990 に答える
1

EFを使用するRIAは、M:Mの関係が嫌いです。あなたがする必要があるのは、RIAがM:Mを2つの1:M関係として見るのを助けることです。

リンクテーブルに列を追加し(IgnoreThisFieldのようなものを追加します)、ビット型にします。

EFがこのテーブルを見ると、それを別の方法で解釈し、M:M関係を処理できるようになります。

于 2011-03-22T14:37:34.260 に答える
0

ちょうどこれに出くわしました:http://m2m4ria.codeplex.com/

いくつかの設定が必要ですが、データベースやエンティティモデルを変更することなく、多対多の問題全体を解決するビューをクライアントに公開します。とても便利だと思いました。

于 2011-10-18T22:23:55.490 に答える