2

好的,我知道这被问了一百万次,但我似乎仍然找不到有效的解决方案。希望我只是错过了一些东西。通过 RIA 使用带有 silverlight 的实体,我的数据库中有一个多对多的表结构。

[System] - [SystemUsers] - [Users] 

桥接表只有两个 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

带有 EF 的 RIA 不喜欢 M:M 关系。您需要做的是帮助 RIA 将 M:M 视为两个 1:M 关系。

在您的链接表上添加一个额外的列(我添加了 IgnoreThisField 之类的内容)并使其成为位类型。

当 EF 看到这个表时,它现在会以不同的方式解释它,从而允许您处理 M:M 关系。

于 2011-03-22T14:37:34.260 回答
1

我不知道实体框架,但这是使用 NHibernate 在 RIA 中的工作原理......

我的型号是Users - UserRoleGrant - Role。您必须在脑海中对模型进行翻译。

以下代码的重要部分是......确保您的模型上具有正确的关联名称,确保您在关联中设置了正确的属性名称,在设置 UserRoleAssociation 的 User 属性时设置 UserID 属性。如果您不设置此 ID,您将无法通过关联属性访问相关实体。

您可能也不需要 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 回答
0

刚刚遇到这个: http: //m2m4ria.codeplex.com/

它需要一些设置,但向客户端公开了一个视图,可以解决整个多对多问题,而无需修改您的数据库或实体模型。我发现它非常有用。

于 2011-10-18T22:23:55.490 回答