Одата> EF> Выбрать SQL из таблицы - PullRequest
0 голосов
/ 08 марта 2020

Мое определение таблицы POCO выглядит следующим образом, и, поскольку я хочу использовать его в качестве виртуальной сущности в Dynamics CE, он должен иметь возможность использовать $ expand на конечной точке OData в следующих коллекциях.

public partial class ak_iglead_V
{

    [Key]
    public Guid ak_igLeadId_V { get; set; }  //the pk
     ....
    public virtual ICollection<ak_Match> ak_MatchLead { get; set; }

}

public partial class ak_Match
{
    [Key]
    [Column(Order = 0)]
    public Guid MatchId { get; set; }
    public Guid ak_LeadId { get; set; } //Foreign key to 
    public Guid? ak_matchLeadId { get; set; } //forreign key to 
    public Guid? ak_matchContactId { get; set; }
    public decimal? ak_Confidance { get; set; }
    public string ak_Name { get; set; }
    [SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly"),ForeignKey("ak_LeadId")]
    public virtual ak_iglead_V ak_iglead_V { get; set; }
    [SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly"),ForeignKey("ak_matchLeadId")]
    public virtual ak_iglead_V ak_iglead_V_matched { get; set; }
}

Однако проблема возникает, когда я хочу вернуть объект в контроллер: SQL, сгенерированное из приведенного выше определения, выглядит следующим образом:

SELECT 
1 AS [C1], 
[m].[MatchId] AS [MatchId], 
[m].[ak_LeadId] AS [ak_LeadId], 
[m].[ak_matchLeadId] AS [ak_matchLeadId], 
[m].[ak_matchContactId] AS [ak_matchContactId], 
[m].[ak_Confidance] AS [ak_Confidance], 
[m].[ak_Name] AS [ak_Name], 
[m].[ak_iglead_V_ak_igLeadId_V] AS [ak_iglead_V_ak_igLeadId_V], --generates error column does not* exists
[m].[ak_iglead_V_ak_igLeadId_Vmatched] AS [ak_iglead_V_ak_igLeadId_Vmatched] --column does not exists
FROM [dbo].[ak_Match] AS [m]

Это фрагмент кода:

`public List<ak_Match> Matches { get; set; }
 public void Initialize()
{
    var matches = from m in db.akMatches
                  select m;
    this.Matches= matches.ToList() ;
`

и сгенерировал исключение, потому что он не может найти столбцы, которые должны были быть коллекцией.

Разве это не может быть каким-то образом проигнорировано в SQL для коллекций или внешних ключей? Каким-то образом, потому что ключ одной и той же таблицы, я думаю, что она каким-то образом запутана.

System.Data.Entity.Core.EntityCommandExecutionException:
Произошла ошибка при выполнении определения команды. Подробности см. Во внутреннем исключении.

SqlException:

Неверное имя столбца 'ak_iglead_V_ak_igLeadId_V'
Неверное имя столбца 'ak_iglead_V_ak_igLeadId_Vmatched'

Ответы [ 2 ]

1 голос
/ 09 марта 2020

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

0 голосов
/ 09 марта 2020

таблица ak_match должна обрабатывать внешний ключ к той же сущности ak_igLead_v: обратите внимание на атрибуты [ForeignKey], указывающие на именованные свойства навигации,

public partial class ak_Match //V_CE_ak_match
{
    [Key]
    public Guid ak_MatchId { get; set; }

    [ForeignKey("FK_ak_Match_ak_igLead_V")]
    public Guid ak_LeadId { get; set; }

    [ForeignKey("FK_ak_Match_ak_igLead_Matched")]
    public Guid? ak_matchLeadId { get; set; }
    public Guid? ak_matchContactId { get; set; }
    public decimal? ak_Confidance { get; set; }
    public string ak_Name { get; set; }

    [InverseProperty("ak_MatchLead")]
    public virtual ak_iglead_V FK_ak_Match_ak_igLead_V { get; set; }

    [InverseProperty("ak_MatchedLead")]
    public virtual ak_iglead_V FK_ak_Match_ak_igLead_Matched { get; set; }
}

@ david - которые указали мне в правильном направлении.

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