c# - fluent nhibernate - 具有属性的多对多映射

标签 c# nhibernate fluent-nhibernate nhibernate-mapping

我有 2 个主表,它们由如下的映射表链接

User [UserId,Name]

Resource [ResourceId,Name]

UserResourceMap [UserId,ResourceId,AccessLevel]

将 AccessLevel 作为资源属性的 Resource 和 User ClassMap 看起来如何?

我的领域类看起来像这样

public class User
{
    public virtual int UserId { get;protected set; }
    public virtual string Name { get;set; }
}
public class Resource
{
    public virtual int ResourceId { get;protected set; }
    public virtual string Name { get;set; }
    public virtual string AccessLevel { get;set; }//Issue-populate this using fluent
}

如何使用 fluent 映射下面代码中的 accessLevel 属性。

public class UserMap : ClassMap<User>
    {
        public UserMap()
        {
            Table("User");
            Id(x => x.Key);
            Map(x=>x.Name);
        }
    }

public class ResourceMap : ClassMap<Resource>
    {
        public ResourceMap()
        {
            Table("Resource");
            Id(x => x.Key);
            Map(x=>x.Name);//Need some Map Here to make a hasManyToMany Map with attribute
        }
    }

最佳答案

您的域模型似乎与您的数据库模型不匹配 - 资源类具有属性 AccessLevel(即每个资源一个 AccessLevel)但在数据库模型中 AccessLevel 是映射表中的一列(即每个用户资源一个 AccessLevel关系)。

假设 DB 模型是正确的模型(相当简单)映射方法是引入这样的类。

public class UserResource {

  public virtual int UserResourceId { get; protected set; }
  public virtual User User { get; set; }
  public virtual Resource { get; set; }
  public virtual string AccessLevel { get; set; }
}

然后这样映射:

public class UserResourceMap : ClassMap<UserResource> {

  public UserResourceMap() {

    Table("UserResourceMap");
    Id(x => x.UserResourceId);
    References(x => x.User).UniqueKey("UniqueUserAndResource");
    References(x => x.Resource).UniqueKey("UniqueUserAndResource");
    Map(x => x.AccessLevel);
  }
}

如果您想要双向关联,您还可以在 User 和/或 Resource 上添加 Collection 属性,并将它们映射到 HasMany(...).Inverse()。当然,这种映射会在 UserResourceMap 表中引入一个新的 UserResourceId 列(使用由 User 和 Resource 组成的复合键可以缓解这种情况)。

另一种解决方案是添加 EntityMap 关联。如果关联归 User 所有,则它将是 Dictionary 属性。像这样的事情可能会成功:

public class User {
  public virtual int UserId { get; protected set; }
  public virtual string Name { get; set; }
  public virtual Dictionary<Resource, string> Resources { get; set; } // Resource -> AccessLevel
}

public class UserMap : ClassMap<User> {

  public UserMap() {

    Table("User");
    Id(x => x.UserId);
    Map(x => x.Name);
    HasMany<Resource, string>(x => x.Resources).AsEntityMap().Element("AccessLevel");
  }
}

关于c# - fluent nhibernate - 具有属性的多对多映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5028172/

相关文章:

c# - 带有提示按钮的主动消息传递 - Microsoft Bot Framework

.net - 当 3rd 方库依赖于旧版本时,使用带有新 publicKeyToken 的另一个版本的程序集

nhibernate - 时间和休眠

c# - 流畅的 NHibernate 和延迟加载

asp.net-mvc-3 - 如何在 Specflow 测试期间切换数据库?

C# 如何处理多个相同的异常?

c# - XML - 通过另一个属性进行属性配对/值检查

c# - 使用 Autofac 在两个 Controller 中获取不同的界面

c# - Fluent NHibernate 中的内存泄漏

nhibernate - NHibernate Join Fetch(种类)