2016-03-03 2 views
1

Пожалуйста, помогите. Я Don `T понять, почему из моего контекста сущностиEntity Framework таинственная ошибка

var stagesExist = context.WfwDocumentWorkStages 
    .Any(it => it.Enabled && it.ExecutionId == execution.Id 
    && it.Level == execution.Level && it.ResultId == null); 

значение stagesExist ложно Но

var stages = context.WfwDocumentWorkStages.Where(it => it.Enabled 
    && it.ExecutionId == execution.Id 
    && it.Level == execution.Level).ToList(); 
bool stagesExist = stages.Any(it=>it.ResultId == null); 

значение stagesExist верно ??

+1

Попробуйте изменить последнее предложение в первой реализации на '&& it.ResultId == null'. Я думаю, что вы снова захватываете 'it' с другим значением ... –

+0

это просто опечатка – milvus

ответ

0

Модель:

public partial class WfwDocumentWorkScheme : EnabledEntity 
{ 
    public WfwDocumentWorkScheme() 
    { 
     this.WfwExecutionEvents = new List<WfwExecutionEvent>(); 
    } 

    public int ExecutionId { get; set; } 
    public int Level { get; set; } 
    public int? RoleId { get; set; } 
    public string CoordinatorSid { get; set; } 
    public DateTimeOffset? Date { get; set; } 
    public int? ResultId { get; set; } 
    public string Comment { get; set; } 
    public virtual Employee Coordinator { get; set; } 
    public virtual EmployeeRole EmployeeRole { get; set; } 
    public virtual WfwEventResult WfwEventResult { get; set; } 
    public virtual WfwDocumentExecution WfwDocumentExecution { get; set; } 
    public virtual ICollection<WfwExecutionEvent> WfwExecutionEvents { get; set; } 
} 

Mapping

public class WfwDocumentWorkSchemeMap : EntityTypeConfiguration<WfwDocumentWorkScheme> 
{ 
    public WfwDocumentWorkSchemeMap() 
    { 
     // Primary Key 
     this.HasKey(t => t.Id); 

     // Properties 
     this.Property(t => t.CoordinatorSid) 
      .HasMaxLength(46); 

     // Table & Column Mappings 
     this.ToTable("WfwDocumentWorkSchemes"); 
     this.Property(t => t.Id).HasColumnName("Id"); 
     this.Property(t => t.ExecutionId).HasColumnName("ExecutionId"); 
     this.Property(t => t.Level).HasColumnName("Level"); 
     this.Property(t => t.RoleId).HasColumnName("RoleId"); 
     this.Property(t => t.CoordinatorSid).HasColumnName("CoordinatorSid"); 
     this.Property(t => t.Date).HasColumnName("Date"); 
     this.Property(t => t.ResultId).HasColumnName("ResultId"); 
     this.Property(t => t.Comment).HasColumnName("Comment"); 
     this.Property(t => t.Enabled).HasColumnName("Enabled"); 

     // Relationships 
     this.HasRequired(t => t.Coordinator) 
      .WithMany(t => t.WfwDocumentWorkSchemes) 
      .HasForeignKey(d => d.CoordinatorSid); 
     this.HasRequired(t => t.WfwDocumentExecution) 
      .WithMany(t => t.WfwDocumentWorkSchemes) 
      .HasForeignKey(d => d.ExecutionId); 
     this.HasRequired(t => t.WfwEventResult) 
      .WithMany(t => t.WfwDocumentWorkSchemes) 
      .HasForeignKey(d => d.ResultId); 
     this.HasOptional(t => t.EmployeeRole) 
      .WithMany(t => t.WfwDocumentWorkSchemes) 
      .HasForeignKey(d => d.RoleId); 
    } 
} 

Результат модель содержит Виртуальный список

public class WfwEventResult : EnabledEntity 
{ 
    public WfwEventResult() 
    { 
     this.WfwExecutionEvents = new List<WfwExecutionEvent>(); 
     this.WfwDocumentWorkSchemes = new List<WfwDocumentWorkScheme>(); 
    } 

    public string Name { get; set; } 
    public string Description { get; set; } 
    public bool Success { get; set; } 
    public virtual ICollection<WfwExecutionEvent> WfwExecutionEvents { get; set; } 
    public virtual ICollection<WfwDocumentWorkScheme> WfwDocumentWorkSchemes { get; set; } 
} 
+0

Было бы лучше изменить исходный вопрос, а не ставить это как ответ. – CodeThug

+0

Спасибо! в следующий раз сделать – milvus

0

И SQL Profiler показать этот запрос

SELECT 
CASE WHEN (EXISTS (SELECT 
    1 AS [C1] 
    FROM (SELECT 1 AS X) AS [SingleRowTable2] 
    WHERE 1 = 0 
)) THEN cast(1 as bit) ELSE cast(0 as bit) END AS [C1] 
FROM (SELECT 1 AS X) AS [SingleRowTable1] 

Почему Entity Framework не работает правильно ???

0

Проблема эта строка в вашем отображении:

this.HasRequired(t => t.WfwEventResult) 

Вы эффективно говорить EF, что соответствующий FK колонки никогда не будет null (хотя вы сделали это int? и есть записи с null значением) , Помните, что EF использует информацию метаданных при создании SQL-запросов, и в этом случае я полагаю, что оптимизатор запросов решает, что этот запрос никогда не вернет записи (похожие на .Where(it => false)) и генерирует поддельный SQL-запрос, который вы видите.

Вскоре - убедитесь, что вы всегда предоставляете правильную информацию EF. В этом случае измените приведенное выше на

this.HasOptional(t => t.WfwEventResult) 

и вы увидите другой (реальный) запрос и получите правильные результаты.

+0

Большое вам спасибо! Живи и учись – milvus

Смежные вопросы