Можно ли ссылаться на внешний ключ с обоими классами в C#? - PullRequest
0 голосов
/ 22 апреля 2020

Предположим, у меня есть два класса Country и Currency, и я хочу создать связь между ними, используя EF.

public class Country
{
    public long Id {get; set;}
    public string Name {get; set;} 

    public long? CurrencyId {get; set;}
    public Currency Currency {get; set;}
}

public class Currency
{
    public long Id {get; set;}
    public string Name {get; set;} 

    public long? CountryId {get; set;}
    public Country Country {get; set;}
}

Я не могу справиться с этим, у меня есть некоторые модели в того же типа. Как и User и Organization.

* Organization имеет Nullable UserId, а User имеет Nullable organization. Как я могу справиться с этим?

Ответы [ 2 ]

1 голос
/ 22 апреля 2020
public class Country
{
    public long Id {get; set;}
    public string Name {get; set;} 

    public long? CurrencyId {get; set;}
    [ForeignKey("CurrencyId")]
    public virtual Currency Currency {get; set;}
}

public class Currency
{
    public long Id {get; set;}
    public string Name {get; set;} 

    public long? CountryId {get; set;}
    [ForeignKey("CountryId")]
    public virtual Country Country {get; set;}
}

вам понадобится ссылка using System.ComponentModel.DataAnnotations.Schema;

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

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

В частности, EF не имеет соглашения о сопоставлении свойств обратной навигации, когда между двумя объектами существует несколько взаимосвязей.

EG

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }

    public int DepartmentId { get; set; }

    [InverseProperty(nameof(EfCore3Test.Department.Members))]
    public Department Department { get; set; }

    [InverseProperty(nameof(EfCore3Test.Department.Manager))]
    public virtual ICollection<Department> ManagedDepartments { get; } = new HashSet<Department>();
}
public class Department
{
    public int Id { get; set; }
    public virtual ICollection<Person> Members { get; } = new HashSet<Person>();
    public Person Manager { get; set; }
    public int ManagerId { get; set; }
}

И, как правило, каскадирование невозможно поведение на всех FK, поэтому вы настраиваете хотя бы один, чтобы не каскадировать.

modelBuilder.Entity<Department>()
            .HasMany(d => d.Members)
            .WithOne(m => m.Department)
            .OnDelete(DeleteBehavior.NoAction);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...