3-х сторонние отношения: пользователь, LOB и роль - PullRequest
1 голос
/ 08 июля 2011

Допустим, у нас есть Пользователь, Линия бизнеса (LOB) и Роль.У пользователя есть 1 ЛОБ.Но пользователь также может иметь несколько ролей в разных LOB.

Модель Code First ниже создает 3 таблицы USERS, ROLES и LOBS.Если оставить его на свое устройство, он также создает UserRoles.Что не то, что я хочу.

До сих пор я пытался создать объект UserLOBRole {RoleId, UserId, LOBCode} и помечал все поля как составные первичные, однако EF лает по поводу внешнего ключа.

Можно ли как-нибудь описать сначала такие отношения в коде EF 4.1?

Любая помощь очень ценится.

public class User
{
    public int UserId {get;set;}
    public string UserName {get;set;}
    public virtual LOB UserLOB {get;set;}

    // HOW DO I DEFINE RELATIONSHIP HERE? 
    public virtual ICollection<Role> UserRoles {get;set;}

}

public class Role
{
    public int RoleId {get;set;}
    public string RoleName {get;set;}
}

public class LOB
{
    public string LOBCode {get;set;}
    public string LobName {get;set;}
}

1 Ответ

0 голосов
/ 09 июля 2011

Невозможно без предоставления UserLOBRole в качестве отдельной сущности и соединения User, Role и LOB через эту новую сущность. Скрытие таблицы соединений работает только для отношения «многие ко многим» без каких-либо дополнительных данных, но это не так.

public class UserLOBRole
{
    [Key, Column(Order = 0)]
    public int UserId { get; set; }
    [Key, Column(Order = 1)]
    public int RoleId { get; set; }
    [Key, Column(Order = 2)]
    public string LOBCode { get; set; }

    public virtual User User { get; set; }
    public virtual Role Role { get; set; }
    [ForeignKey("LOBCode")]
    public virtual LOB LOB { get; set; }
}

Ваш код, вероятно, жалуется на FK, потому что Код EF сначала требует свойства навигации по крайней мере на одной стороне реализации , а ваши LOB и Role в настоящее время не имеют его, поэтому UserLOBRole должен иметь их.

И ваш User теперь будет использовать:

public class User
{
    public int UserId {get;set;}
    public string UserName {get;set;}
    public virtual LOB UserLOB {get;set;}

    public virtual ICollection<UserLOBRole> UserRoles {get;set;}
}
...