Как смоделировать сущность с FK для двух сущностей, которые также имеют отношения между собой - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь создать следующую модель с EF6, сначала используя код.

enter image description here

Когда я получаю запрос, я сначала хочу сохранить его как запись в Запросе. После этого запрос может привести к созданию обратной связи или Запись о продаже.

  • Продажа имеет FK для запроса, и не должно быть возможности иметь несколько записей продажи, ссылающихся на один и тот же запрос.
  • У обратной связи есть FK для запроса, и это не должно быть возможнымиметь несколько записей обратной связи, ссылающихся на один и тот же запрос.
  • Обратная связь имеет FK для продажи, и не должно быть возможности иметь несколько записей обратной связи, ссылающихся на одну и ту же продажу.
  • Я хочу использовать свойства навигации в своих сущностях, чтобы я мог дляПример получения непосредственно при продаже соответствующего запроса и обратной связи - при наличии.

Ниже созданных мною классов сущностей:

public class Request
{
    public int Id { get; set; }

    public DateTime ReceivedDateTime { get; set; }

    public virtual Feedback Feedback { get; set; }
    public virtual Sale Sale { get; set; }
}

public class Feedback
{
    public int RequestId { get; set; } 
    public int SaleId { get; set; }

    public string Remark { get; set; }

    public virtual Request Request { get; set; }
    public virtual Sale Sale { get; set; }
}

public class Sale
{
    public int Id { get; set; }

    public int RequestId { get; set; }
    public DateTime RegistrationTimestamp { get; set; }

    public virtual Feedback Feedback { get; set; }
    public virtual Request Request { get; set; }
}

И дополнительно добавлена ​​следующая свободная конфигурация:

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Entity<Feedback>()
    .HasKey(t => new { t.RequestId, t.SaleId });
modelBuilder.Entity<Feedback>()
    .HasRequired(t => t.Sale).WithOptional(sale => sale.Feedback);
modelBuilder.Entity<Feedback>()
    .HasRequired(t => t.Request).WithOptional(req => req.Feedback);
modelBuilder.Entity<Sale>()
    .HasOptional(t => t.Feedback).WithRequired(t => t.Sale)
    .WillCascadeOnDelete(false);
modelBuilder.Entity<Request>()
    .HasOptional(t => t.Feedback).WithRequired(t => t.Request)
    .WillCascadeOnDelete(true);
modelBuilder.Entity<Sale>()
    .HasRequired(t => t.Request).WithOptional(t => t.Sale)
    .WillCascadeOnDelete(true);

На основе этого EF генерирует следующий сценарий миграции для создания таблицы Feedback.

CreateTable(
    "dbo.Feedback",
    c => new
        {
            RequestId = c.Int(nullable: false),
            SaleId = c.Int(nullable: false),
            Remark = c.String(),
            Request_Id = c.Int(nullable: false),
            Sale_Id = c.Int(nullable: false),
        })
    .PrimaryKey(t => new { t.RequestId, t.SaleId })
    .ForeignKey("dbo.Request", t => t.Request_Id, cascadeDelete: true)
    .ForeignKey("dbo.Sale", t => t.Sale_Id)
    .Index(t => t.Request_Id)
    .Index(t => t.Sale_Id);

Почему EF добавляет поля Feedback.Sale_Id и Feedback.Request_Id хотя оба поля не существуют в моем определении класса? Я также не понимаю, почему он использует эти «волшебные» Sale_Id и Request_Id вместо SaleId и RequestId в качестве FK для таблицы «Продажа и запрос»?

Когда я применяю первый подход к базе данных, я получаю запроси сущности Feedback генерируются, как я ожидал, но затем сущность Sale получает свойство навигации, поддерживающее несколько записей Feedback:

public class Sale
{
    public int Id { get; set; }
    public int RequestId { get; set; }
    public DateTime RegistrationTimestamp { get; set; }
    public virtual ICollection<Feedback> Feedbacks { get; set; }
    public virtual Request Request { get; set; }
}

Это заставляет меня задаться вопросом, содержит ли моя ERD ограничение, не поддерживаемое EF?

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