2

「指定されたキャストは無効です」という例外をときどきスローし始めたアプリケーションがあります。このエラーを一貫して再現することはできず、それが私と私のユーザーを夢中にさせています。

問題のあるコード:

public Complaint GetComplaintById(int Id)
{
    Complaint complaint = (from c in _context.cts_complaints
                           join ud in _context.cts_user_details on c.CreatedBy equals ud.UserId
                           where c.Id == Id
                           select new Complaint
                           {
                              Id = c.Id,
                              CompanyId = c.CompanyId,
                              ComplaintTypeId = c.ComplaintTypeId,
                              CategoryId = c.CategoryId,
                              ReportCategoryId = c.ReportCategoryId,
                              ParentId = c.ParentId,
                              LanguageId = c.LanguageId,
                              AreaId = c.AreaId,
                              Title = c.Title,
                              Description = c.Description,
                              ResponseDue = c.ResponseDue,
                              DateReceived = c.DateReceived,
                              FPSCNumber = c.FPSCNumber,
                              FPSCRepresentative = c.FPSCRepresentative,
                              ContactMethodId = c.ContactMethodId,
                              ContactedBy = c.ContactedBy,
                              CreatedDate = c.CreatedDate,
                              CreatedBy = c.CreatedBy,
                              CreatedByName = ud.Name,
                              Status = c.Status,
                              AttachmentsArchived = c.AttachmentsArchived,
                              Timestamp = c.Timestamp,
                            }).FirstOrDefault();

    complaint.Users = this.GetUsersByComplaintId(Id);

    return complaint;
}

スタックトレース:

Specified cast is not valid.
   at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult)
   at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries)
   at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
   at System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression)
   at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable`1 source)
   at ComplaintTracking.Business.Data.SqlComplaintRepository.GetComplaintById(Int32 Id) in C:\SourceCode2010\ComplaintTracking\Service Pack\1.0 ComplaintTracking\ComplaintTracking.Business\Data\SqlComplaintRepository.cs:line 20
   at ComplaintTracking.Business.Managers.ComplaintManager.GetComplaintById(Int32 Id) in C:\SourceCode2010\ComplaintTracking\Service Pack\1.0 ComplaintTracking\ComplaintTracking.Business\Managers\ComplaintManager.cs:line 33
   at ComplaintTracking.Web.UserControls.ComplaintViews.ResolveViewPresenter.Init() in C:\SourceCode2010\ComplaintTracking\Service Pack\1.0 ComplaintTracking\ComplaintTracking.Web\UserControls\ComplaintViews\ResolveViewPresenter.cs:line 39
   at ComplaintTracking.Web.Library.BaseUserControl`2.OnLoad(EventArgs e) in C:\SourceCode2010\ComplaintTracking\Service Pack\1.0 ComplaintTracking\ComplaintTracking.Web\Library\BaseUserControl.cs:line 56
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

更新: リポジトリパターンを利用しようとしています。cts_complaintsというLINQ2SQL ORMオブジェクトがあります。これは、SQLServerテーブルdbo.cts_complaintsからの1-1マッピングです。私のアプリケーションには、Complaintというモデルがあります。私のリポジトリはcts_complaintsからComplaintにマッピングしています。

[HasSelfValidation]
public class Complaint
{
    public Complaint()
    {
    CreatedBy = System.Threading.Thread.CurrentPrincipal.Identity.Name;
    CreatedDate = DateTime.Now;
    DateReceived = DateTime.Now;
    Users = new List<ComplaintUser>();
    }

    public int Id { get; internal set; }
    public int CompanyId { get; set; }
    public int ComplaintTypeId { get; set; }
    public int CategoryId { get; set; }
    public int ReportCategoryId { get; internal set; }
    public int? ParentId { get; set; }
    public int LanguageId { get; set; }
    public int? AreaId { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public DateTime ResponseDue { get; set; }
    public DateTime DateReceived { get; set; }
    public string FPSCNumber { get; set; }
    public string FPSCRepresentative { get; set; }
    public int ContactMethodId { get; set; }
    public string ContactedBy { get; set; }
    public int Status { get; set; }
    public bool AttachmentsArchived { get; set; }
    public DateTime CreatedDate { get; internal set; }
    public string CreatedBy { get; internal set; }
    public string CreatedByName { get; set; }       
    public byte[] Timestamp { get; internal set; }
    public List<ComplaintUser> Users { get; internal set; }

    [SelfValidation()]
    public void ValidateUsers(ValidationResults results)
    {
    //if id is 0 it's new.  There must be user
    if (Users.Count==0)
            results.AddResult(new ValidationResult("You must assign at least one user.", this, "Users", "", null));

    }
}

cts_complaints:

CREATE TABLE [dbo].[cts_complaint](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [CompanyId] [int] NOT NULL,
    [ComplaintTypeId] [int] NOT NULL,
    [CategoryId] [int] NOT NULL,
    [ReportCategoryId] [int] NOT NULL,
    [ParentId] [int] NULL,
    [LanguageId] [int] NOT NULL,
    [AreaId] [int] NULL,
    [Title] [nvarchar](50) NOT NULL,
    [Description] [nvarchar](max) NOT NULL,
    [ResponseDue] [datetime] NOT NULL,
    [DateReceived] [datetime] NOT NULL,
    [FPSCNumber] [nvarchar](50) NOT NULL,
    [FPSCRepresentative] [nvarchar](50) NOT NULL,
    [ContactMethodId] [int] NOT NULL,
    [ContactedBy] [nvarchar](50) NOT NULL,
    [CreatedDate] [datetime] NOT NULL,
    [CreatedBy] [nvarchar](50) NOT NULL,
    [Status] [int] NOT NULL,
    [AttachmentsArchived] [bit] NOT NULL,
    [Timestamp] [timestamp] NOT NULL,
 CONSTRAINT [PK_cts_complaint] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

cts_user_details:

CREATE TABLE [dbo].[cts_user_detail](
    [UserId] [nvarchar](50) NOT NULL,
    [Name] [nvarchar](50) NOT NULL,
    [Email] [nvarchar](255) NOT NULL,
    [ManagerEmail] [nvarchar](255) NOT NULL,
    [Role] [nvarchar](15) NOT NULL,
    [Timestamp] [timestamp] NOT NULL,
 CONSTRAINT [PK_cts_user_detail_1] PRIMARY KEY CLUSTERED 
(
    [UserId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
4

2 に答える 2

3

同じエラーが発生し、問題も断続的に発生しました。

原因は、データベースの列の型と .dbml ファイルのフィールドの型の間の型の不一致でした

そのため、自動生成された linq2sql クラス (つまり、自分でコーディングしたと思われるモデル クラス Complaint ではなく、cts_complaints) の型がデータベースの型と一致することを確認してください。

(私の特定のケースの詳細: linq2sql .dbml ファイルには double 型のフィールドがありましたが、データベースでは列は datetime でした-それがどのように起こったのかわかりません-おそらく最初は DB 列と .dbml フィールドが同じ型で、その後誰かが .dbml ファイルを再生成せずに DB の型を変更します)。

于 2012-08-23T08:30:15.530 に答える
1

エラー:キャストが無効です (LINQ を使用してエンティティからデータグリッドにデータをロードしようとしている間)

原因 :マッピング エンティティと SQL サーバー テーブルでデータ型が異なります。

例 :私の場合、Entity クラスで int を使用し、DB で bigint を使用していたため、エラーが発生していました。

于 2012-10-18T04:44:38.880 に答える