【问题标题】:"The * field is required" when the EF object has the field already当 EF 对象已经有该字段时,“* 字段是必需的”
【发布时间】:2014-12-18 19:40:20
【问题描述】:

我的数据模型如下:

[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();

然后上下文保存就好了。

这里有什么问题?

编辑:顺便说一下,我正在使用代理和延迟加载。

【问题讨论】:

    标签: c# entity-framework ef-code-first entity-framework-6


    【解决方案1】:

    您应该使用必需属性标记简单属性,而不是导航属性:

    [Table("PbnJobs")]
    public abstract class PbnJob : Job
    {
        public virtual PbnSite Site{ get; set; }
    
        [ForeignKey("Site")]
        [Required]
        public int SiteId { get; set; }
    }
    

    在这种情况下,Required 没有用,因为您的外键属性不可为空。

    【讨论】:

    • 我明白了。那么我该如何处理我的问题呢?我的意思是,就像你说的那样,我不能将 SiteId 标记为必需,因为 int 不可为空。
    • 好吧,因为 PbnJob 对象如果没有 Site 对象则无效。
    • 由于不可为空的外键,它是必需的。必需的属性是不必要的,你可以简单地删除它,一切都会按照你的意愿工作。
    猜你喜欢
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 2020-01-01
    • 1970-01-01
    • 2023-02-07
    相关资源
    最近更新 更多