无法使用空字符串值创建新实体

时间:2018-03-06 04:11:30

标签: c# entity-framework

当我尝试在C#EF中创建一个新的CRMTItem实体时(使用数据库第一种方法),我有一个非常讨厌的问题。

代码:

using (var db = new ADVWKSPEntities())
{
    foreach (var adv in advs)
    {
        var crmtItem = new CRMTItem()
        {
            Id = adv.PrimaryId,
            ProjectTitle = adv.ProjectTitle,
            // ProjectId = adv.id
            CreatedByUser = new Guid(adv.CreatedBy),
            Opportunity = new Guid(adv.Opportunity),
            BidNoBid = adv.Bnb,
            SPUrl = adv.SPUrl,
            BnbId = new Guid(adv.BnbId),
            Stage = adv.ProjectStage,
            Confidential = adv.Confidential,
            OpportunityStatus = adv.OpportunityStatus,
            OpportunityNumber = adv.OpportunityNumber,
            CRMTNumber = adv.CrmtNumber,
            ProjectNumber = adv.ProjectNumber,
            Sector = adv.Sector,
            Service = adv.Service,
            CreatedDate = adv.CreatedDate,
            Archive = adv.Archive,
            ProjectManager = adv.ProjectManager,
            WorkTeam = adv.WorkTeam,
            Custodian = adv.Custodian
        };

        db.CRMTItems.Add(crmtItem);
    }
    await db.SaveChangesAsync();
}

数据库:

enter image description here

值:

Archive             null                                    string
Bnb                 null                                    string
BnbId               null                                    string
Confidential        false                                   bool
CreatedBy           "e1ef8e25-1624-46f0-9336-1674f1cffaeb"  string
CreatedDate         {2/03/2018 4:15:59 AM}                  System.DateTime
CrmtNumber          "121659"                                string
Custodian           null                                    string
ModifiedBy          "e1ef8e25-1624-46f0-9336-1674f1cffaeb"  string
ModifiedDate        {2/03/2018 4:15:59 AM}                  System.DateTime
Opportunity         "be67b7e9-eb3f-e211-8d73-78e3b5108e61"  string
OpportunityNumber   ""                                      string
OpportunityStatus   ""                                      string
PrimaryId           1                                       int
ProjectManager      null                                    string
ProjectNumber       null                                    string
ProjectStage        "Opportunity"                           string
ProjectTitle        "Some project name"                     string
RecordId            0                                       int
SPUrl               null                                    string
Sector              "aef0a38b-29fe-e111-9f8b-78e3b51146cb"  string
Service             "Deliver"                               string
WorkTeam            null                                    string

错误:

  

值不能为空。参数名称:g

堆栈跟踪:

[ArgumentNullException: Value cannot be null.
Parameter name: g]
   System.Guid..ctor(String g) +12961864
   ADVWKSP.Controllers.<Index>d__0.MoveNext() in C:\Users\Bassie\source\repos\TFS\ADVWKSP\ADVWKSP\Controllers\HomeController.cs:22
   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +61
   System.Web.Mvc.Async.TaskAsyncActionDescriptor.EndExecute(IAsyncResult asyncResult) +97
   System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeAsynchronousActionMethod>b__36(IAsyncResult asyncResult) +17
   System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +48
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +32
   System.Web.Mvc.Async.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d() +50
   System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +228
   System.Web.Mvc.Async.<>c__DisplayClass33.<BeginInvokeActionMethodWithFilters>b__32(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +48
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +34
   System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +26
   System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +100
   System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +48
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27
   System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +13
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +29
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +48
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +36
   System.Web.Mvc.Controller.<BeginExecute>b__15(IAsyncResult asyncResult, Controller controller) +12
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +22
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +48
   System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +26
   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10
   System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +21
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +29
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +48
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +28
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
   System.Web.CallHandlerExecutionStep.InvokeEndHandler(IAsyncResult ar) +152
   System.Web.CallHandlerExecutionStep.OnAsyncHandlerCompletion(IAsyncResult ar) +126

似乎它不希望我将NULL值插入字符串列中,即使这些列可以为空...为什么会发生这种情况?

1 个答案:

答案 0 :(得分:0)

问题是因为我试图将null字符串转换为Guid - 错误消息实际上没有用,而且对象初始化者实际上最终浪费了大量时间的原因......

将对象创建分割出来之后

crmtItem.Id = adv.PrimaryId;
crmtItem.ProjectTitle = adv.ProjectTitle;
crmtItem.CreatedByUser = (adv.CreatedBy == null) ? (Guid?)null : new Guid(adv.CreatedBy);
crmtItem.Opportunity = (adv.Opportunity == null) ? (Guid?)null : new Guid(adv.Opportunity);
crmtItem.BidNoBid = adv.Bnb;
crmtItem.SPUrl = adv.SPUrl;
crmtItem.BnbId = (adv.Bnb == null) ? (Guid?)null : new Guid(adv.BnbId);
crmtItem.Stage = adv.ProjectStage;
crmtItem.Confidential = adv.Confidential;
crmtItem.OpportunityStatus = adv.OpportunityStatus;
crmtItem.OpportunityNumber = adv.OpportunityNumber;
crmtItem.CRMTNumber = adv.CrmtNumber;
crmtItem.ProjectNumber = adv.ProjectNumber;
crmtItem.Sector = adv.Sector;
crmtItem.Service = adv.Service;
crmtItem.CreatedDate = adv.CreatedDate;
crmtItem.Archive = adv.Archive;
crmtItem.ProjectManager = adv.ProjectManager;
crmtItem.WorkTeam = adv.WorkTeam;
crmtItem.Custodian = adv.Custodian;

我可以把它缩小到Guids。

但是,由于C#/实体框架不能以某种方式处理Guid / null的三元运算符,我必须使用

将空值转换为Guid?
(Guid?)null

它似乎工作.....现在