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