Как добавить отношения один ко многим на основе пользовательского свойства - PullRequest
0 голосов
/ 04 сентября 2018

Допустим, у меня есть две сущности:

public class Customer
{
     public int CustomerId { get; set; }
     public Guid CustomerKey { get; set; }

     public ICollection<Product> Products { get; set; }
}

public class Product
{
     public int ProductId { get; set; }
     public Guid CustomerKey { get; set; }
     public string Name { get; set; }
}

1 клиент может иметь много продуктов, но я хочу связать их на основе свойства CustomerKey. Вот пример данных примера:

CustomerId | CustomerKey
    1      | {00000000-0000-0000-0000-111111111111}
    2      | {00000000-0000-0000-0000-222222222222}

ProductId  | Name     | CustomerKey
    1      | Product1 | {00000000-0000-0000-0000-111111111111}
    2      | Product2 | {00000000-0000-0000-0000-111111111111}
    3      | Product3 | {00000000-0000-0000-0000-222222222222}

Таким образом, у первого покупателя есть первые два продукта, а у второго покупателя - последний. Я пытался сделать что-то вроде:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Customer>().HasMany(m => m.Products);
}

Но как мне указать, что я хочу связать их с CustomerKey?

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Это возможно, но только если свойство CustomerKey (столбец) Customer уникально. Это требование EF Core (на самом деле требование FK для реляционной базы данных, но EF Core поддерживает только отношения, которые могут быть представлены как ограничения FK для реляционной базы данных), поэтому, если это не так, то то, что вы спрашиваете, невозможно.

Свободный API для этого HasPrincipalKey метод:

Конфигурирует уникальное свойство (я), на которое нацелены эти отношения. Обычно этот метод вызывается только в том случае, если вы хотите использовать свойство (я), отличное от первичного ключа, в качестве основного свойства (свойств). Если указанные свойства не являются уникальным ограничением (или первичным ключом), то будет введено новое уникальное ограничение.

И, конечно, FK настроен как обычно с HasForeignKey.

Применение к вашей модели:

modelBuilder.Entity<Customer>()
    .HasMany(customer => customer.Products)
    .WithOne() // no navigation property
    .HasForeignKey(product => product.CustomerKey)
    .HasPrincipalKey(customer => customer.CustomerKey);
0 голосов
/ 04 сентября 2018

Объявляем оба класса со свойствами навигации друг к другу. Отметьте одну из таблиц (зависимая таблица) атрибутом ForeignKey в ее первичном ключе.

public class Customer
{
     public int CustomerId { get; set; }
     [Index("IX_Customer_Key", 1, IsUnique = true)]
     public Guid CustomerKey { get; set; }

     public ICollection<Product> Products { get; set; }
}

public class Product
{
     public int ProductId { get; set; }
     public Guid CustomerKey { get; set; }
     public string Name { get; set; }

     [ForeignKey("CustomerKey")]
     public Customer Customer{ get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...