C# &引用;*字段是必填的";当EF对象已具有该字段时
我的数据模型如下所示:C# &引用;*字段是必填的";当EF对象已具有该字段时,c#,entity-framework,ef-code-first,entity-framework-6,C#,Entity Framework,Ef Code First,Entity Framework 6,我的数据模型如下所示: [Table("Jobs")] public abstract class Job { public int Id { get; set; } public DateTime? StartTime { get; set; } } [Table("PbnJobs")] public abstract class PbnJob : Job { [Required] public virtual PbnSite Site{ get; set;
[Table("Jobs")]
public abstract class Job
{
public int Id { get; set; }
public DateTime? StartTime { get; set; }
}
[Table("PbnJobs")]
public abstract class PbnJob : Job
{
[Required]
public virtual PbnSite Site{ get; set; }
[ForeignKey("Site")]
public int SiteId { get; set; }
}
[Table("DomainJobs")]
public class DomainJob : PbnJob
{
}
public class PbnSite
{
public int Id { get; set; }
}
var context = new LmDbContext();
var job = context.Jobs.First();
job.StartTime = DateTime.Now;
_context.SaveChanges();
站点只是一个外键对象
我的代码如下所示:
[Table("Jobs")]
public abstract class Job
{
public int Id { get; set; }
public DateTime? StartTime { get; set; }
}
[Table("PbnJobs")]
public abstract class PbnJob : Job
{
[Required]
public virtual PbnSite Site{ get; set; }
[ForeignKey("Site")]
public int SiteId { get; set; }
}
[Table("DomainJobs")]
public class DomainJob : PbnJob
{
}
public class PbnSite
{
public int Id { get; set; }
}
var context = new LmDbContext();
var job = context.Jobs.First();
job.StartTime = DateTime.Now;
_context.SaveChanges();
问题是,上面的代码抛出类型为的异常
System.Data.Entity.Validation.DbEntityValidationException
他说:
“站点字段是必需的”
不过,当我补充说:
var site = ((PbnJob)job).Site;
制定代码:
var context = new LmDbContext();
var job = context.Jobs.First();
var site = ((PbnJob)job).Site;
job.StartTime = DateTime.Now;
_context.SaveChanges();
然后,上下文被保存得很好
这里有什么问题
编辑:顺便说一下,我正在使用代理和延迟加载。您应该使用必需的属性简单属性标记,而不是导航属性:
[Table("PbnJobs")]
public abstract class PbnJob : Job
{
public virtual PbnSite Site{ get; set; }
[ForeignKey("Site")]
[Required]
public int SiteId { get; set; }
}
在这种情况下,Required没有用,因为您的外键属性不可为null。我明白了。那么我该如何处理我的问题呢?我的意思是,正如你所说,我不能将SiteId标记为必需的,因为int不可为null。因为如果PbnJob对象没有Site对象,它就无效。它将是必需的,因为它的外键不可为null。Required属性是不必要的,您可以简单地删除它,所有这些都将按照您的需要工作。