1

Итак, у меня есть код первая модель, которая выглядит следующим образом:Code First Entity Framework создает список <> свойство неправильно

public class SeciovniContext : DbContext 
{ 
    public DbSet<User> Users { get; set; } 
    public DbSet<Permission> Permissions { get; set; } 
} 

public class User 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int UserID { get; set; } 

    [StringLength(30)] 
    [Required] 
    public string FirstName { get; set; } 

    [StringLength(30)] 
    [Required] 
    public string LastName { get; set; } 

    [StringLength(50)] 
    [EmailAddress] 
    [Required] 
    public string Email { get; set; } 

    public List<Permission> Permisions { get; set; } 
} 

public class Permission 
{ 
    [Key] 
    // TODO: [Index(IsUnique = true)] 
    public string PermissionType { get; set; } 

    [Required] 
    public string Description { get; set; } 
} 

И в семени моем , У меня есть следующее:

var permissions = new List<Permission> { 
    new Permission() { PermissionType = "Admin", Description = "Admin" }, 
    new Permission() { PermissionType = "Editor", Description = "Editor" } 
}; 

context.Permissions.AddRange(permissions); 
context.SaveChanges(); 

var user1 = new User() 
{ 
    Email = "[email protected]", 
    FirstName = "David", 
    LastName = "Jones", 
    Permisions = permissions, 
}; 

var user2 = new User() 
{ 
    Email = "[email protected]", 
    FirstName = "John", 
    LastName = "Doe", 
    Permisions = permissions.Where(p => p.PermissionType == "Admin").ToList() 
}; 

context.Users.Add(user1); 
context.Users.Add(user2); 

context.SaveChanges(); 

Я бы ожидал, что это каким-то образом свяжет одного пользователя с N разрешениями. И, таким образом, у Дэвида были бы права «Admin» и «Edit», тогда как у Джона просто было бы «Edit».

Однако, когда база данных выполнена, она выглядит следующим образом:

----------------------------------------- 
| User Table       | 
----------------------------------------- 
| UserID | Email | FirstName | LastName | 
----------------------------------------- 


----------------------------------------- 
| Permissions Table      | 
----------------------------------------- 
| PermissionType | Description | UserID | 
----------------------------------------- 

Таким образом, Дэвид имеет разрешение администратора (но не редактировать) и Джон имеет редактирования. Кроме того, то, что делает db.Users.FirstOrDefault(/* query */).Permissions, тоже пуст.

Поскольку я ожидаю, что у вас будет конечное количество разрешений, я действительно ожидаю чего-то более похожего на нижеследующее, в котором есть «средняя» таблица, которая связывает их вместе. Но я не хочу, чтобы вручную поддерживать эту таблицу ссылок. Есть ли способ сделать то, что я пытаюсь сделать: иметь конечное количество разрешений (которые не дублируются) с бесконечным числом пользователей?

Вот еще, что я бы ожидать, если эта база данных была создана вручную:

----------------------------------------- 
| User Table       | 
----------------------------------------- 
| UserID | Email | FirstName | LastName | 
----------------------------------------- 


-------------------------------- 
| Permissions Table   | 
-------------------------------- 
| PermissionType | Description | 
-------------------------------- 


--------------------------- 
| UserPermissions Table | 
--------------------------- 
| PermissionType | UserId | 
--------------------------- 
+2

Взгляните на [Отношения] (https://docs.microsoft.com/en-us/ef/core/modeling/relationships), особенно раздел ** Many-to-many **. В ближайшее время у вас ** есть ** для поддержания таблицы ссылок вручную (они планируют добавить то, что вы хотите в какой-то более поздней версии) –

ответ

2

Что ты спрашиваешь известен как многие-ко-многим с автоматической распределительной таблицы. Он поддерживался в EF6, но not supported yet in EF Core, хотя в некоторой будущей версии есть plan.

Так что в настоящее время у вас нет другого выбора, кроме как поддерживать явное соединение объединения, как описано в документации.

+0

Ну, это раздражает. Но, по крайней мере, я знаю, что теперь я не схожу с ума (я знал, что раньше делал что-то подобное) – David

+1

Да. У них есть так много вещей, чтобы поймать (не считая обработки запросов, которая в настоящее время ужасна) :( –

Смежные вопросы