簡體   English   中英

將多個導航屬性配置到同一個表時出錯

[英]Error while configuring multiple Navigation Properties to same table

我有一個奇怪的問題,多個導航屬性到同一個表。

我的FuelBunkerType POCO類配置如下:

    public class FuelBunkerType : IEventReportElement
{

    public long Id { get; set; }
    public string TypeKey { get; set; }        
    public string TypeValue { get; set; }
    public decimal? Sulphur { get; set; }
    public decimal? Water { get; set; }
    public decimal? Viscosity { get; set; }
    public decimal? Density { get; set; }
    public string BdnNumber { get; set; }
    public long? IdEventReport { get; set; }
    public long? DeactivatedByIdEventReport { get; set; }

    public IList<FuelBunkerQuantity> FuelBunkerQuantitys { get; set; }
    public EventReport EventReport { get; set; }
    public EventReport DeactivatedByEventReport { get; set; }
}

在DbContext中,我的類配置如下:

    modelBuilder.Entity<FuelBunkerType>().HasKey(x => x.Id);
        if (_writeversion) modelBuilder.Entity<FuelBunkerType>().Property(x => x.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
        else modelBuilder.Entity<FuelBunkerType>().Property(x => x.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        modelBuilder.Entity<FuelBunkerType>().HasRequired(x => x.EventReport).WithMany().HasForeignKey(x => x.IdEventReport);
        modelBuilder.Entity<FuelBunkerType>().HasOptional(x => x.DeactivatedByEventReport).WithMany().HasForeignKey(x => x.DeactivatedByIdEventReport);

到現在為止還挺好。 直到星期五,它實際上都是這樣的。 但是,當我嘗試從表中獲取數據時,生成的查詢看起來像

{SELECT 
1 AS [C1], 
[Extent1].[Id] AS [Id], 
[Extent1].[TypeKey] AS [TypeKey], 
[Extent1].[TypeValue] AS [TypeValue], 
[Extent1].[Sulphur] AS [Sulphur], 
[Extent1].[Water] AS [Water], 
[Extent1].[Viscosity] AS [Viscosity], 
[Extent1].[Density] AS [Density], 
[Extent1].[BdnNumber] AS [BdnNumber], 
[Extent1].[IdEventReport] AS [IdEventReport], 
[Extent1].[DeactivatedByIdEventReport] AS [DeactivatedByIdEventReport], 
[Extent1].[EventReport_Id] AS [EventReport_Id]
FROM [FuelBunkerType] AS [Extent1]}

這顯然導致“列名無效”錯誤,因此我的第一個配置行(Entity()。HasRequired(x => x.EventReport)...)被忽略。 我試着注釋掉了DeactivatedByEventReport的配置,它導致了除DeactivatedByEventReport_Id之外的相同查詢(如預期的那樣),它只發生在同一個表的多個導航屬性中。 但是,當我向EventReport添加更多導航屬性時,它只會錯誤地查詢EventReport_Id,因此當存在多個導航屬性時,似乎只會忽略第一個。

任何想法為什么會發生這種情況,以及如何解決這個問題? 問候

編輯:對於與此對應的其他類,有以下Fluent API配置:

if (_writeversion) modelBuilder.Entity<EventReport>().Property(x => x.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
        else modelBuilder.Entity<EventReport>().Property(x => x.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        modelBuilder.Entity<EventReport>().HasKey(x => x.Id);
        modelBuilder.Entity<EventReport>().Property(x => x.Id).HasColumnName("Id");
        modelBuilder.Entity<EventReport>().Ignore(x => x.MaxEventTimeLt);
        modelBuilder.Entity<EventReport>().Ignore(x => x.MaxEventTimeUtc);
        modelBuilder.Entity<EventReport>().Ignore(x => x.MinEventTimeLt);
        modelBuilder.Entity<EventReport>().Ignore(x => x.MinEventTimeUtc);
        modelBuilder.Entity<EventReport>().Ignore(x => x.EventReportElementTyps);
        modelBuilder.Entity<EventReport>().Ignore(x => x.EventsWithUpdatedSortNumber);
        modelBuilder.Entity<EventReport>().Ignore(x => x.EventTimeUtcLoaded);
        modelBuilder.Entity<EventReport>().Ignore(x => x.HasChanged);

      modelBuilder.Entity<FuelBunkerQuantity>().HasKey(x => x.Id);
        if (_writeversion) modelBuilder.Entity<FuelBunkerQuantity>().Property(x => x.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
        else modelBuilder.Entity<FuelBunkerQuantity>().Property(x => x.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        modelBuilder.Entity<FuelBunkerQuantity>().HasOptional(x => x.FuelBunkerType).WithMany().HasForeignKey(x => x.IdFuelBunkerType);
        //modelBuilder.Entity<FuelBunkerQuantity>().HasOptional(x => x.EventReport).WithMany().HasForeignKey(x => x.IdEventReport);
        modelBuilder.Entity<FuelBunkerQuantity>().Ignore(x => x.EventReport);

EventReport上的Configs不會產生任何影響,因為你可以看到我在FuelBunkerQuantity上禁用了導航屬性,試試這是否導致錯誤,但它沒有改變錯誤或最終的查詢。

EDIT2:類EventReport:

public class EventReport
{
    public long Id { get; set; }


    public long? SortNumber { get; set; }
    public string ReportType { get; set; }
    public DateTime? CreationTimeUtc { get; set; }


    public DateTime? EventTimeUtc { get; set; }

    public DateTime? EventTimeUtcLoaded { get; set; }
    public DateTime? EventTimeLt { get; set; }
    public long? EventDuration { get; set; }
    public DateTime? LastSendAtUtc { get; set; }
    public DateTime? LastSendAtLt { get; set; }
    public DateTime? FirstSendAtUtc { get; set; }
    public DateTime? FirstSendAtLt { get; set; }
    public string EventQualityState { get; set; }
    public bool IsDraft { get; set; }

    [IgnoreOnEqualCheck]
    public IEnumerable<FuelBunkerRob> FuelRoB { get; set; }
    [IgnoreOnEqualCheck]
    public IEnumerable<OilBunkerRob> OilRoB { get; set; }
    [IgnoreOnEqualCheck]
    public List<FuelBunkerType> ActiveFuelTypes { get; set; }
    [IgnoreOnEqualCheck]
    public DateTime? MaxEventTimeUtc { get; set; }
    [IgnoreOnEqualCheck]
    public DateTime? MaxEventTimeLt { get; set; }
    [IgnoreOnEqualCheck]
    public DateTime? MinEventTimeUtc { get; set; }
    [IgnoreOnEqualCheck]
    public DateTime? MinEventTimeLt { get; set; }


    public List<EventReport> EventsWithUpdatedSortNumber {get; set;}


    public long? ConfigurationId { get; set; }


    public bool HasChanged { get; set; }
    public List<IEventReportElement> EventReportElements { get; set; }
}

EDIT3:我剛剛跳過導致錯誤的Statement。 原來FuelBunkerQuantity也有錯誤的翻譯(請參閱編輯中的配置):

{SELECT 
1 AS [C1], 
[Extent1].[Id] AS [Id], 
[Extent1].[IdFuelBunkerType] AS [IdFuelBunkerType], 
[Extent1].[MassDelta] AS [MassDelta], 
[Extent1].[MassAbsolut] AS [MassAbsolut], 
[Extent1].[IdEventReport] AS [IdEventReport], 
[Extent1].[FuelBunkerType_Id] AS [FuelBunkerType_Id]
FROM [FuelBunkerQuantity] AS [Extent1]}

好像有什么事情壞了,但我不知道是什么。

當您在EventReportFuelBunkerType之間配置兩個一對一的關系時,在許多方面只有一個集合EF無法匹配關系。 根據集合屬性ActiveFuelTypes所屬的關系,您可以像這樣顯式映射它:

modelBuilder.Entity<FuelBunkerQuantity>().
             HasOptional(x => x.FuelBunkerType).
             WithMany(e => e.ActiveFuelTypes).
             HasForeignKey(x => x.IdFuelBunkerType);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM