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属性是不必要的,您可以简单地删除它,所有这些都将按照您的需要工作。