我在另一个正在运行的应用程序中有2个新实体,我已经修剪了不相关的属性(所有内容都标记为虚拟):
QuoteOverrideRequest
void startScriptCollector(char *php , char *collectorName , char *collectorRaw , char *collectorLog){
char str_script[80];
char str_raw[80];
char str_log[80];
int result = 0;
int fd_output , fd_error; //File Descriptor
setreuid(geteuid(), geteuid());
//stat_rtrim(collectorLog);
//removeChar(collectorLog,'\n');
if(collectorLog != NULL) trim(collectorLog);
tmLogPrintf(Log, TMLOG_LEVEL_ERROR , "On startScriptCollector collectorName : %s , collectorRaw : %s , collectorLog : %s...\n",
collectorName, collectorRaw , collectorLog);
//exit(-1);
sprintf(str_script , "%s/%s" , SLAVIEW_CUSTOM_SCRIPTS , collectorName);
sprintf(str_raw , "%s/%s" , SLAVIEW_CUSTOM_TMPCOL , collectorRaw);
sprintf(str_log , "%s/%s" , VARDIR , collectorLog);
fd_output = open(str_raw, O_CREAT | O_WRONLY , 0777);
fd_error = open(str_log, O_CREAT | O_WRONLY , 0777);
if(fd_output < 0){
tmLogPrintf(Log, TMLOG_LEVEL_ERROR , "Script %s not could save data in %s...\n",
collectorName , str_raw);
exit(-1);
}
if(fd_error < 0){
tmLogPrintf(Log, TMLOG_LEVEL_ERROR , "Script %s not could save error log ...\n",
collectorName);
//exit(-1);
}
dup2(fd_output , 1); //write on data file
dup2(fd_error , 2); //write on error file
result = execl(PHPEXEC , "php" , str_script , NULL);
if(result == -1){
tmLogPrintf(Log, TMLOG_LEVEL_ERROR , "Error, on execute script %s ...", collectorName);
exit(-1);
}
}
所有3个导航属性都以相同的方式映射。当我创建一个新的QuoteOverrideRequest并插入它时,RequestedBy和Quote会自动填充它们的实体。状态不是。
public virtual int RequestedById { get; set; }
public virtual int QuoteId { get; set; }
public virtual int StatusId { get; set; }
//nav properties
public virtual Customer RequestedBy { get; set; }
public virtual Quote Quote { get; set; }
public virtual QuoteOverrideRequestStatus Status { get; set; }
insert函数调用一个Repository,它将对象添加到DbSet并调用DbContext.SaveChanges()
我认为问题出在QuoteOverrideRequestStatus上,因为其他2个类延迟正确加载。如果我在函数中先前获得了该Status的实例,它将在插入后显示在Status属性中。
QuoteOverrideRequestStatus类有一个公共无参数构造函数,它的所有属性都是虚拟的。
QuoteOverrideRequest request = new QuoteOverrideRequest();
request.QuoteId = quoteId;
request.RequestedById = _workContext.CurrentCustomer.Id;
request.StatusId = 1;
_quoteService.InsertOverrideRequest(request);
BaseEntity具有Id属性。我已经确认,当所有这些运行时,DbContext上的延迟加载和代理生成都是正确的。
答案 0 :(得分:0)
new QuoteOverrideRequest()
这不正确。延迟加载对于使用new
关键字实例化的模型的属性不起作用。
您应该使用db.Set<T>().Create()
,其中db
是您DbContext
的实例,T
是您的模型。
这将实例化模型的正确代理对象,该对象将启用延迟加载导航属性。