C# EF6和延迟加载,验证对上下文的更改时关联的实体为空
我觉得这很奇怪。我使用EF6加载一个实体,修改它,然后保存它。下面是一个简单的例子 负载:C# EF6和延迟加载,验证对上下文的更改时关联的实体为空,c#,entity-framework,validation,C#,Entity Framework,Validation,我觉得这很奇怪。我使用EF6加载一个实体,修改它,然后保存它。下面是一个简单的例子 负载: var clientQuery = from x in Context.Clients where x.DateTimeCreated > latest_time orderby x.DateTimeCreated descending, x.IsPosted ascending
var clientQuery = from x in Context.Clients
where x.DateTimeCreated > latest_time
orderby x.DateTimeCreated descending, x.IsPosted ascending
select x;
this.Clients = new ObservableCollection<Client>(clientQuery);
int cnt = this.Clients.Count;
TotalPages = cnt / itemsPerPage;
if (cnt % itemsPerPage != 0)
TotalPages += 1;
clientViewSource.Source = this.Clients;
我使用IValidatableObject类来确保所有值都有效。但是,在检查“客户端”实体时,其关联的大小写在验证期间为空。在点击SaveChanges之前,我已经验证了上下文有变化,并且客户端的“Case”不是null。我是否遗漏了一些东西,我是否期望得到一个与验证无关的结果
验证示例:
public partial class Client : IValidatableObject
{
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if(IsStrategic)
{
if(StrategicCase.ExternalLeadSource == null)
{
yield return new ValidationResult
("No external lead source set.", new [] {"StrategicCase.ExternalLeadSource"});
}
}
}
}
既然您使用的是延迟加载,为什么需要在验证中检查null。访问时将加载案例,如果您的验证逻辑不需要加载案例,那么它将为null。您的意思是,即使加载了“案例”,如果它没有特定于“案例”实体的任何更改,它也不会作为父“客户机”对象的一部分传递给验证类吗,当您尝试访问它时,案例被加载,如果您没有在验证逻辑中访问它,它将为null。我正在验证逻辑中访问它,这就是为什么我知道它为null。验证逻辑在检查“客户端”实体时引发异常。客户端实体的一部分是其“Case”和“Case”的值。发布一些验证逻辑代码
public partial class Client : IValidatableObject
{
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if(IsStrategic)
{
if(StrategicCase.ExternalLeadSource == null)
{
yield return new ValidationResult
("No external lead source set.", new [] {"StrategicCase.ExternalLeadSource"});
}
}
}
}