Несколько внешних ключей одного типа в Entity Framework - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть Issue сущность, имеющая 2 поля от FK до User сущности, как показано ниже.Хотя я правильно настроил свойства для предотвращения создания дополнительных полей Xxx_Id вместо PropertyNameId, в таблице создано поле Xxx_Id помимо полей PropertyNameId.В этом примере поле User_Id создается в таблице Issue помимо полей AssigneeId и ReporterId.Здесь есть какая-то ошибка?HashSet в сущности User вызывает это дополнительное поле User_Id?

Проблема:

public class Issue : BaseEntity
{
    [Key]
    public int Id { get; set; }

    //Foreign key for Reporter (User entity)
    public short ReporterId { get; set; }

    //Foreign key for Assignee (User entity)
    public short AssigneeId { get; set; }

    [ForeignKey("ReporterId")]
    public virtual User Reporter { get; set; }

    [ForeignKey("AssigneeId")]
    public virtual User Assignee { get; set; }
}

Пользователь:

public class User : BaseEntity 
{
    [Key]
    public short Id { get; set; }

    public string UserName { get; set; }

    public string Email { get; set; }

    //code omitted for brevity 

    public User()
    {
        Issues = new HashSet<Issue>();
        //code omitted for brevity 
    }        

    public virtual ICollection<Issue> Issues { get; set; }

    //code omitted for brevity 
}

Вот соответствующие строки в файле миграции:

CreateTable(
            "Issue",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    ReporterId = c.Short(nullable: false),
                    AssigneeId = c.Short(nullable: false),
                    User_Id = c.Short() //???
                })
            .PrimaryKey(t => t.Id)
            .ForeignKey("com.User", t => t.User_Id)  //???
            .ForeignKey("com.User", t => t.AssigneeId)
            .ForeignKey("com.User", t => t.ReporterId)
            .Index(t => t.ReporterId)
            .Index(t => t.AssigneeId)
            .Index(t => t.User_Id);  //???

1 Ответ

0 голосов
/ 14 февраля 2019

Когда вы пытаетесь создать несколько ForeignKey одного и того же типа, ваши классы моделей должны быть следующими:

public class User : BaseEntity
{
    public User()
    {
        ReporterIssues = new HashSet<Issue>();
        AssigneeIssues = new HashSet<Issue>();
    }

    [Key]
    public short Id { get; set; }
    public string UserName { get; set; }
    public string Email { get; set; }

    // Navigation properties
    public virtual ICollection<Issue> ReporterIssues { get; set; }
    public virtual ICollection<Issue> AssigneeIssues { get; set; }
}

public class Issue : BaseEntity
{
    [Key]
    public int Id { get; set; }
    public short ReporterId { get; set; }
    public short AssigneeId { get; set; }

    // Navigation properties
    public virtual User Reporter { get; set; }
    public virtual User Assignee { get; set; }
}

Затем в конфигурации OnModelCreating выполните следующие действия:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<User>().HasMany(u => u.AssigneeIssues)
            .WithRequired(i => i.Assignee).HasForeignKey(a => a.AssigneeId)
            .WillCascadeOnDelete(false); // <-- cascade delete must be false

        modelBuilder.Entity<User>().HasMany(u => u.ReporterIssues)
            .WithRequired(i => i.Reporter).HasForeignKey(a => a.ReporterId)
            .WillCascadeOnDelete(false); // <-- cascade delete must be false
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...