Ваша модель домена, кажется, не соответствует вашей модели базы данных - класс Resource имеет свойство AccessLevel (т.е. один AccessLevel на ресурс), но в модели DB AccessLevel представляет собой столбец в таблице карты (т. Е. Один AccessLevel на пользовательский ресурс).отношение).
Если предположить, что модель БД является правильной моделью, то один (довольно простой) способ сопоставления состоит в том, чтобы ввести такой класс.
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);
}
}
Если вы хотите двунаправленные ассоциации, вы также можете добавить свойство Collection в User и / или Resource и сопоставить их с HasMany (...). Inverse ().Конечно, этот тип сопоставления привел бы к появлению нового столбца UserResourceId в таблице UserResourceMap (использование составного ключа, состоящего из User и Resource, уменьшило бы это).
Другим решением будет добавление ассоциации EntityMap.Если ассоциация принадлежит пользователю, это будет словарьимущество.Нечто подобное может сработать:
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");
}
}