当我尝试在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();
}
数据库:
值:
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
值插入字符串列中,即使这些列可以为空...为什么会发生这种情况?
答案 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
它似乎工作.....现在