C# 实体框架Guid,用于连接表的字符串
我在网上尝试了很多建议,但都没有效果。我试图使用实体框架从数据库返回值,但我的TransactionId是GUID。代码在尝试将GUID转换为字符串时引发错误。以下是我最初的想法:C# 实体框架Guid,用于连接表的字符串,c#,entity-framework,asynchronous,C#,Entity Framework,Asynchronous,我在网上尝试了很多建议,但都没有效果。我试图使用实体框架从数据库返回值,但我的TransactionId是GUID。代码在尝试将GUID转换为字符串时引发错误。以下是我最初的想法: var entityVerification = from tl in _context.TransactionLogs join ts in _context.TransactionStatuses on tl.GUTransactionId equals ts.GUTransactionId where tl.E
var entityVerification = from tl in _context.TransactionLogs
join ts in _context.TransactionStatuses on tl.GUTransactionId equals ts.GUTransactionId
where tl.ExternalTargetAccountNumber == accountNumber
orderby ts.PostedTime descending
select new TransactionHistoryEntity
{
TransactionId = tl.GUTransactionId,
SourceAccountNumber = tl.ExternalSourceAccountNumber,
ActionCode = tl.ActionCode,
Amount = tl.Amount,
CurrencyCode = tl.CurrencyCode,
PostedTime = ts.PostedTime,
StatusCode = ts.StatusCode
};
return await entityVerification.ToListAsync();
我尝试创建一个查询对象,稍后可以将TransactionId转换为字符串,但这会引发相同的错误:
var transactionLogs = _context.TransactionLogs;
var transactionStatus = _context.TransactionStatuses;
var test = transactionLogs.ToList().Join(transactionStatus, ts => ts.GUTransactionId, tl => tl.GUTransactionId,
(tl, ts) => new
{
ts.GUTransactionId,
tl.ExternalSourceAccountNumber,
tl.ActionCode,
tl.Amount,
tl.CurrencyCode,
ts.PostedTime,
ts.StatusCode
});
以下是堆栈跟踪:
at System.Data.SqlClient.SqlBuffer.get_String()
at lambda_method(Closure , DbDataReader )
at Microsoft.EntityFrameworkCore.Storage.Internal.TypedRelationalValueBufferFactory.Create(DbDataReader dataReader)
at Microsoft.EntityFrameworkCore.Query.Internal.AsyncQueryingEnumerable`1.AsyncEnumerator.BufferlessMoveNext(DbContext _, Boolean buffer, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.ExecuteAsync[TState,TResult](TState state, Func`4 operation, Func`4 verifySucceeded, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Query.Internal.AsyncQueryingEnumerable`1.AsyncEnumerator.MoveNext(CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Query.Internal.AsyncLinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.MoveNext(CancellationToken cancellationToken)
at System.Linq.AsyncEnumerable.Aggregate_[TSource,TAccumulate,TResult](IAsyncEnumerable`1 source, TAccumulate seed, Func`3 accumulator, Func`2 resultSelector, CancellationToken cancellationToken) in D:\a\1\s\Ix.NET\Source\System.Interactive.Async\Aggregate.cs:line 120
at DataManagement.Data.Repository.FTTransact.TransactionLogRepository.GetTransactionHistory(String accountNumber) in D:\Source\DayforceSpecialProjects\Fintech\Platform\DataManagement\Data\Repository\FTTransact\TransactionLogRepository.cs:line 39
背景:
modelBuilder.Entity<TransactionLogEntity>(entity =>
{
entity.ToTable("TransactionLog");
entity.HasKey("GUTransactionId");
entity.Property(e => e.GlbGuProgramId)
.HasColumnName("GLB_GUProgramId")
.HasColumnType("bigint");
entity.Property(e => e.GlbGuProductId)
.HasColumnName("GLB_GUProductId")
.HasColumnType("bigint");
entity.Property(e => e.Amount)
.HasColumnType("decimal(18,10)");
entity.Property(e => e.CurrencyCode)
.HasColumnType("nvarchar(10)");
entity.Property(e => e.Units)
.HasColumnType("decimal(18,10)");
entity.Property(e => e.ValuePerUnit)
.HasColumnType("decimal(18,10)");
entity.Property(e => e.TransactionReceivedTime)
.HasColumnType("datetime");
entity.Property(e => e.TargetPostingTime)
.HasColumnType("datetime");
entity.Property(e => e.RequestTransactionId)
.HasColumnType("nvarchar(128)");
entity.Property(e => e.ExternalTargetAccountNumber)
.HasColumnType("nvarchar(128)");
entity.Property(e => e.ExternalSourceAccountNumber)
.HasColumnType("nvarchar(128)");
entity.Property(e => e.TargetRegGuAccountId)
.HasColumnName("TargetREG_GUAccountId")
.HasColumnType("bigint");
entity.Property(e => e.SourceRegGuAccountId)
.HasColumnName("SourceREG_GUAccountId")
.HasColumnType("bigint");
entity.Property(e => e.ActionCode)
.HasColumnType("nvarchar(64)");
});
modelBuilder.Entity<TransactionStatusEntity>(entity =>
{
entity.ToTable("TransactionStatus");
entity.HasKey("GUTransactionStatusId");
entity.Property(e => e.GUTransactionId)
.HasColumnType("guid");
entity.Property(e => e.PostedTime)
.HasColumnType("datetime");
entity.Property(e => e.StatusCode)
.HasColumnType("nchar(10)");
});
我只需要将GUID转换为字符串。看起来应该很简单,但这让人头疼。哪些是guid,哪些是字符串?实际的错误是什么?发布完整的异常文本,包括调用堆栈、表模式和类。如果您在转换为字符串时遇到错误,您应该尝试找出问题所在,而不是试图掩盖它。其中一个属性很可能不是Guid。或者数据库字段是字符串而不是GUID,并且包含无效数据。或者,您传递的参数是无法解析为GUID的字符串。使用
ToJoin
不会修复任何问题,它会加载内存中的所有内容,而不是连接服务器上的数据。可能是TransactionLogs。GUTransactionId
是GUID,而TransactionStatus.GUTransactionId
是字符串,反之亦然。可能是TransactionHistoryEntity.TransactionId
是一个GUID,但GUTransactionId
是一个字符串,其中包含无法解析为GUID的内容。在任何情况下,您都不需要任何连接。ORM的工作是根据实体和上下文配置之间的关系创建JOIN语句。TransactionLog
实体应具有Status
属性或Status
集合,具体取决于关系的类型。您只需要编写context.TransactionLogs.Where(log=>log…)。选择(log=>newTransactionHistoryEntity{PostedTime=log.Status.PostedTime…。})代码>错误消息如下:无法将“System.Guid”类型的对象强制转换为“System.String”类型。我更新了上面的问题以包含堆栈跟踪。GUID是GutTransactionID。
public class TransactionStatusEntity
{
public string GUTransactionStatusId { get; set; }
public string GUTransactionId { get; set; }
public DateTime PostedTime { get; set; }
public string StatusCode { get; set; }
}
public class TransactionLogEntity
{
public string GUTransactionId { get; set; }
public long GlbGuProgramId { get; set; }
public long GlbGuProductId { get; set; }
public decimal Amount { get; set; }
public string CurrencyCode { get; set; }
public decimal Units { get; set; }
public decimal? ValuePerUnit { get; set; }
public DateTime TransactionReceivedTime { get; set; }
public DateTime TargetPostingTime { get; set; }
public string RequestTransactionId { get; set; }
public string ExternalTargetAccountNumber { get; set; }
public string ExternalSourceAccountNumber { get; set; }
public long? TargetRegGuAccountId { get; set; }
public long? SourceRegGuAccountId { get; set; }
public string ActionCode { get; set; }
}