Я пытаюсь создать следующую модель с EF6, сначала используя код.
Когда я получаю запрос, я сначала хочу сохранить его как запись в Запросе. После этого запрос может привести к созданию обратной связи или Запись о продаже.
- Продажа имеет 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?