gpt4 book ai didi

c# - 将多个导航属性配置到同一个表时出错

转载 作者:行者123 更新时间:2023-11-30 12:43:14 25 4
gpt4 key购买 nike

我遇到了同一个表的多个导航属性的奇怪问题。

我的 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 上的配置不应产生任何影响,如您所见,我禁用了 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:我刚刚跳过了导致错误的语句。结果 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);

关于c# - 将多个导航属性配置到同一个表时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31786022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com