Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架Guid,用于连接表的字符串_C#_Entity Framework_Asynchronous - Fatal编程技术网

C# 实体框架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

我在网上尝试了很多建议,但都没有效果。我试图使用实体框架从数据库返回值,但我的TransactionId是GUID。代码在尝试将GUID转换为字符串时引发错误。以下是我最初的想法:

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; }
    }