Два внешних ключа с одним и тем же навигационным свойством?

c# entity-framework entity-framework-4 entity-framework-6 orm

Вопрос

Я новичок в платформе Entity Framework, поэтому я мало знаю об этом. В настоящее время я работаю над проектом «Мой колледж», в этом проекте я столкнулся с проблемой, когда у меня есть два внешних ключа, которые относятся к одному столбцу в другой таблице. как я могу справиться с этой ситуацией.

Нужно ли создавать навигационное свойство для каждого внешнего ключа. И если я создам другое свойство Navigaton для ContactId, тогда необходимо создать другое свойство Navigation в классе User, например:

public virtual ICollection<BlockedUser> SomePropertyName { get; set; }

скажите, пожалуйста, лучший способ преодолеть эту проблему. Я использую Entity Framework 6.

Вот мои классные классы:

public virtual ICollection<BlockedUser> SomePropertyName { get; set; }

Принятый ответ

Нужно ли создавать навигационное свойство для каждого внешнего ключа?

Да, или, точнее: вам нужно как минимум одно свойство навигации для каждого отношения . «По крайней мере один» означает, что вы можете решить, из какого из двух объектов вы хотите добавить свойство навигации. Обычно это зависит от наиболее распространенных случаев использования вашего приложения, если вы часто хотите перейти от объекта A к объекту B или наоборот. Если вы хотите, вы можете добавить свойства навигации для обоих объектов, но вам не нужно.

В вашей модели у вас, по-видимому, две (один-ко-многим) отношения. Если вы хотите открыть свойства навигации в обоих объектах, вам понадобится четыре свойства навигации и - важно! - вы должны определить, какие свойства навигации образуют пару для отношения (см. [InverseProperty] в следующем фрагменте кода).

С аннотациями данных он хотел бы:

public class BlockedUser
{
    [Key, ForeignKey("User"), Column(Order = 1)]
    public int UserId { get; set; }

    [Key, ForeignKey("Contact"), Column(Order = 2)]
    public int ContactId { get; set; }

    [InverseProperty("BlockedUsers")]
    public virtual User User { get; set; }

    [InverseProperty("BlockedContacts")]
    public virtual User Contact { get; set; }
}

public class User
{
    public int UserId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }

    public virtual ICollection<BlockedUser> BlockedUsers { get; set; }
    public virtual ICollection<BlockedUser> BlockedContacts { get; set; }
}

Если вам не нужна коллекция BlockedContacts вы можете просто удалить ее и [InverseProperty("BlockedContacts")] из свойства « Contact .


Популярные ответы

Вы можете использовать атрибут ForeignKey для решения вашей проблемы. ForeignKey используется для сопряжения свойства навигации и свойства внешнего ключа. Нет никакой разницы между аннотацией данных FK с свойством Foreign Key и FK с навигационными свойствами. Однако следующий код создаст два внешних ключа с другим именем.

public class BlockedUser
{
// User Foreign Key
[ForeignKey("UserId")]
public int UserId { get; set; }               // Composite Primary Key

// User Foreign key
[ForeignKey("BlockedUser_User")]
public int ContactId { get; set; }            // Composite Primary Key

// User Navigation Property
public virtual User User { get; set; }
}

public class User
{
public int UserId { get; set; }  // Primary key
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }

// BlockedUser Navigation Property
public virtual ICollection<BlockedUser> BlockedUsers { get; set; }
}



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему