C# EF Core: как сопоставить «один к нулю» с несколькими свойствами (только с атрибутами) [с обходным путем]? - PullRequest
0 голосов
/ 29 апреля 2020

Community,

Я попробовал свой первый Entity Framework Core проект. Теперь я не могу отобразить свойства в моих моделях, это отношения НЕ один-к-одному , я бы назвал это "Один-к-нулю":

public class ContactDetails
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    [ForeignKey("CreatedById")]
    public User CreatedBy { get; set; }

    [ForeignKey("UpdatedById")]
    public User UpdatedBy { get; set; }

    [ForeignKey("DeletedById")]
    public User DeletedBy { get; set; }

    // foreign keys
    public int? CreatedById { get; set; }
    public int? UpdatedById { get; set; }
    public int? DeletedById { get; set; }
}
public class User
{
    public int Id { get; set; }
    public string MailAdress { get; set; }
    public string Password { get; set; }

    [ForeignKey("ContactDetailsByUserId")]
    public ContactDetails ContactDetailsByUser { get; set; }
    [ForeignKey("ContactDetailsByAdminId")]
    public ContactDetails ContactDetailsByAdmin { get; set; }

    // foreign keys
    public int? ContactDetailsByUserId { get; set; }
    public int? ContactDetailsByAdminId { get; set; }
}

Так что ContactDetails может иметь трех разных пользователей .

User может иметь двух разных ContactDetails .

Если я пытаюсь создать при миграции для этого я получаю эту ошибку:

Невозможно определить отношение, представленное свойством навигации 'ContactDetails.CreatedBy' типа 'Пользователь'. Либо настройте отношение вручную, либо игнорируйте это свойство, используя атрибут «[NotMapped]» или «EntityTypeBuilder.Ignore» в «OnModelCreating».

Я действительно хочу сделать это только с атрибутами, если это возможно, в любом случае с Fluent-API это работает :

protected override void OnModelCreating(ModelBuilder builder)
{
    builder.Entity<ContactDetails>().HasOne(c => c.CreatedBy).WithOne().HasForeignKey<ContactDetails>(c => c.CreatedById).OnDelete(DeleteBehavior.ClientSetNull);
    builder.Entity<ContactDetails>().HasIndex(c => c.CreatedById).IsUnique(false);

    builder.Entity<ContactDetails>().HasOne(c => c.UpdatedBy).WithOne().HasForeignKey<ContactDetails>(c => c.UpdatedById).OnDelete(DeleteBehavior.ClientSetNull);
    builder.Entity<ContactDetails>().HasIndex(c => c.UpdatedById).IsUnique(false);

    builder.Entity<ContactDetails>().HasOne(c => c.DeletedBy).WithOne().HasForeignKey<ContactDetails>(c => c.DeletedById).OnDelete(DeleteBehavior.ClientSetNull);
    builder.Entity<ContactDetails>().HasIndex(c => c.DeletedById).IsUnique(false);

    builder.Entity<User>().HasOne(u => u.ContactDetailsByUser).WithOne().HasForeignKey<User>(u => u.ContactDetailsByUserId).OnDelete(DeleteBehavior.ClientSetNull);
    builder.Entity<User>().HasIndex(u => u.ContactDetailsByUserId).IsUnique(false);

    builder.Entity<User>().HasOne(u => u.ContactDetailsByAdmin).WithOne().HasForeignKey<User>(u => u.ContactDetailsByAdminId).OnDelete(DeleteBehavior.ClientSetNull);
    builder.Entity<User>().HasIndex(u => u.ContactDetailsByAdminId).IsUnique(false);
}

Возможно, что Fluent поможет кому-то, но возможно ли это сделать? с Только атрибуты ?

Спасибо за ваше время.

С наилучшими пожеланиями

Тушеное мясо ie

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...