Строка как внешний ключ - не может преобразовать лямбда-выражение в тип 'string', потому что это не тип делегата - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть ApplicationUser и Group:

public class ApplicationUser : IdentityUser
{
    public int? GroupId { get; set; }
    public Group Group { get; set; }
    // ... some more properties
}

public class Group
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string GroupAdminId { get; set; }
    public ApplicationUser GroupAdmin { get; set; }
    public List<ApplicationUser> GroupUsers { get; set; }
}

Идея состоит в том, что в группе есть один пользователь-администратор и много обычных пользователей. Кроме того, ApplicationUser может быть членом только одного Group как администратора или обычного пользователя.

PK для ApplicationUser имеет тип string (Guid).

Я пытаюсь определить отношения в OnModelCreating(), но я делаю это неправильно:

modelBuilder.Entity<Group>()
    .HasOne(a => a.GroupAdmin)
    .WithOne(g => g.Group)
    .HasForeignKey(a => a.GroupAdminId);

.HasForeignKey(a => a.GroupAdminId) вызывает эту ошибку:

Ошибка CS1660 Невозможно преобразовать лямбда-выражение в тип 'string', поскольку оно не является типом делегата

modelBuilder.Entity<Group>()
    .HasMany(u => u.GroupUsers)
    .WithOne(g => g.Group);

Конфигурация для GroupUsers не показывает никаких ошибок, но, поскольку GroupAdmin -часть не работает, я не проверял.

1 Ответ

0 голосов
/ 21 апреля 2020

Я не очень хорошо понимаю этот материал, но я немного прочитал здесь и немного поэкспериментировал, и это, кажется, работает:

Я изменил * Модель 1005 * для дифференциации связи между администратором и пользователем в конфигурации Group:

public class ApplicationUser : IdentityUser
{
    public int? AdminInGroupId { get; set; }
    public int? UserInGroupId { get; set; }
    public Group AdminInGroup { get; set; }
    public Group UserInGroup { get; set; }
}

OnModelCreating():

modelBuilder.Entity<Group>()
    .HasOne(a => a.GroupAdmin)
    .WithOne(g => g.AdminInGroup)
    .HasForeignKey<ApplicationUser>(a => a.AdminInGroupId);

modelBuilder.Entity<Group>()
    .HasMany(u => u.GroupUsers)
    .WithOne(g => g.UserInGroup)
    .OnDelete(DeleteBehavior.NoAction);
...