entity / ria包含多对多

时间:2011-03-22 13:51:37

标签: silverlight entity-framework-4 linq-to-entities ria domainservices

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

[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");
}

我从来没有让客户端上的用户我是否还缺少其他东西让用户被收录并发送给客户端?

3 个答案:

答案 0 :(得分:1)

我不知道实体框架,但这里是如何在RIA中使用NHibernate ...

我的模型是Users - UserRoleGrant - Role。你必须在头脑中翻译你的模型。

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

您可能也不需要“合成”属性,但您可能会这样阅读以查找... 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;
            }
        }
    }
}

答案 1 :(得分:1)

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

在你的链接表上添加一个额外的列(我添加像IgnoreThisField这样的东西)并使它有点类型。

当EF看到这个表时,它现在将以不同的方式解释它,使你能够处理M:M关系。

答案 2 :(得分:0)

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

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