Ошибка в отношениях между двумя моделями имеет больше ключей в ядре asp.net 2.1 - PullRequest
0 голосов
/ 19 ноября 2018

Проблема:

Отношение от SalesFooter.SaleHeaders к SalesHeader.SalesFooters со свойствами внешнего ключа {'SalesOrderNo': int} не может ориентироваться на первичный ключ {'SalesOrderNo': int, 'SalesType': int, 'SalesYear': int, 'BranchCode': int}, поскольку он несовместим. Настройте основной ключ или набор совместимых свойств внешнего ключа для этого отношения.

подробности:

Я работаю в ASP.NET Core, Entity Framework Core 2.1 с Visual Studio 2017. Когда я устанавливаю отношения между двумя моделями SalesHeader и SalesFooter следующим образом, получаю вышеуказанную ошибку:

public class SalesHeader  
{        

        public int SalesOrderNo { get; set; }  


        public int SalesYear { get; set; }  


        public int BranchCode { get; set; }  


        public int SalesType { get; set; }  
        [Required]  

        public DateTime SalesDate { get; set; }  
        public ICollection<SalesFooter> SalesFooters { get; set; }  

}

public class SalesFooter  
{  

        public int SalesOrderNo { get; set; }  

        public int SalesYear { get; set; }  

        public int BranchCode { get; set; }  

        public int SalesType { get; set; }  

        public int SalesLineNo { get; set; }  
        [Required]  

        public DateTime SalesDate { get; set; }  
        [DataType("decimal(18 ,2")]  
        public decimal Quantity { get; set; }  
        [DataType("decimal(18 ,2")]  
        public decimal UnitPrice { get; set; }  
        [DataType("decimal(18 ,2")]  
        public decimal Total { get; set; }  


        public SalesHeader SaleHeaders{ get; set; }  
}

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

     modelBuilder.Entity<SalesHeader>()  
                .HasKey(t => new { t.SalesOrderNo,t.SalesType,t.SalesYear,t.BranchCode });  
     modelBuilder.Entity<SalesFooter>()  
                .HasKey(t => new { t.SalesOrderNo, t.SalesType, t.SalesYear, t.BranchCode,t.SalesLineNo});  
     modelBuilder.Entity<SalesFooter>().HasOne(e => e.SaleHeaders)  
                     .WithMany(e => e.SalesFooters)  
                     .HasForeignKey(e => e.SalesOrderNo);      
 }  

Как установить связь между двумя моделями на основе приведенных выше ключей?

Пример данных:

Таблица SalesHeader

........................................

SalesOrderNo  SalesYear  BranchCode SalesType  CustomerID  
50              2018        1          1          20  

Таблица SalesFooter

.............................

SalesOrderNo SalesLineNo  SalesYear  BranchCode SalesType  ItemCode  
50                1          2018        1          1          1001  
50                2          2018        1          1          1002  
50                3          2018        1          1          1003 

1 Ответ

0 голосов
/ 19 ноября 2018

Здесь

.HasForeignKey(e => e.SalesOrderNo)

вы говорите EF Core использовать одно свойство (столбец) SalesFooter.SalesOrderNo в качестве FK для SalesHeader.Но SalesHeader использует составной PK {SalesOrderNo, SalesType, SalesYear, BranchCode}.

Тип FK * и эталонный PK должны совпадать.Это означает, что вам нужно настроить составной FK {SalesOrderNo, SalesType, SalesYear, BranchCode}.

. Вы можете сделать это, просто удалив весь

modelBuilder.Entity<SalesFooter>()
    .HasOne(e => e.SaleHeaders)
    .WithMany(e => e.SalesFooters)  
    .HasForeignKey(e => e.SalesOrderNo);

или только

    .HasForeignKey(e => e.SalesOrderNo)

свободноконфигурация, потому что ваша модель / отношения следуют соглашениям EF Core, поэтому EF Core может автоматически идентифицировать отношения с правильными задействованными свойствами навигации / FK / PK.

Но если вы хотите быть явным, используйте тот же синтаксискак для определения составного ПК:

modelBuilder.Entity<SalesFooter>()
    .HasOne(e => e.SaleHeaders)
    .WithMany(e => e.SalesFooters)  
    .HasForeignKey(e => new { e.SalesOrderNo, e.SalesType, e.SalesYear, e.BranchCode }); // <--
...