实体验证错误 - 似乎是加载问题

时间:2014-03-23 22:58:49

标签: c# asp.net-mvc entity-framework validation

我有以下课程:

public class Venue : BaseObject, IBaseObject
{
    [Required]
    public virtual User Owner { get; set; }

    [Required]
    [MaxLength(40)]
    public string Name { get; set; }

    [DisplayName("Region")]
    [Required]
    public virtual StandingData Region { get; set; }

    [DisplayName("Country")]
    [Required]
    public virtual StandingData Country { get; set; }

}

并且

public class StandingData : BaseObject
{
    public string Type { get; set; }
    public int SequenceNumber { get; set; }
    public string Value { get; set; }

    public override string ToString()
    {
        return Value;
    }
}

我的模型构建器如下所示:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<Venue>().HasRequired(x => x.Region);
        modelBuilder.Entity<Venue>().HasRequired(x => x.Country);
    }

我收到以下验证错误:

“字段'Region'是必需的”

“字段'国家'是必需的”

我在单元测试中首先注意到这一点,然后在我的真实Web UI中。它只会在网站上运行时发生。如果我在调用UNIT OF WORK SAVE之前在我的控制器中放置一个断点,它就不会发生,这似乎就像一个加载问题,但我不确定。

还有其他人经历过这个吗?

我真的不明白为什么当我慢慢地执行该程序时它不会发生,这使得我认为它是某种加载/延迟加载问题。

- UPDATE -

如果我在保存对象之前这样做:

        var t = venue.Region;
        var tt = venue.Country;

它没有错误?

为什么会这样?

2 个答案:

答案 0 :(得分:1)

不是直接的答案,而是一种调试正在发生的事情的方法,以及用于评论的大型方法。 查看上下文上下文是否真的正常。 那里有你没想到的参赛作品......

在MyContext类中:

 public void FullDump()
    {

        Debug.WriteLine("=====Begin of Context Dump=======");
        var dbsetList = this.ChangeTracker.Entries();
        foreach (var dbEntityEntry in dbsetList)
        {

            Debug.WriteLine(dbEntityEntry.Entity.GetType().Name + " => " + dbEntityEntry.State);
            switch (dbEntityEntry.State)
            {
                case System.Data.Entity.EntityState.Detached:
                case System.Data.Entity.EntityState.Unchanged:
                case System.Data.Entity.EntityState.Added:
                case System.Data.Entity.EntityState.Modified:
                    WriteCurrentValues(dbEntityEntry);
                    break;
                case System.Data.Entity.EntityState.Deleted:
                    WriteOriginalValues(dbEntityEntry);
                    break;
                default:
                    throw new ArgumentOutOfRangeException();
            }
            Debug.WriteLine("==========End of Entity======");
        }
        Debug.WriteLine("==========End of Context======");
    }

您可以从立即窗口

调用此方法
 `MyContext.FullDump()`

答案 1 :(得分:0)

查看http://msdn.microsoft.com/en-us/data/jj713564

检查声明关系的推荐方法,例如

public class Venue : BaseObject, IBaseObject
{
[Required]
public virtual User Owner { get; set; }

[Required]
[MaxLength(40)]
public string Name { get; set; }

[ForeignKey("RegionId")]
[DisplayName("Region")]
[Required]
public virtual int RegionId { get; set; } // cant see baseObject so I just assume int

[ForeignKey("CountryId")]
[DisplayName("Country")]
[Required]
public int  CountryId { get; set; }


// nav props
public virtual StandingData Region { get; set; }
public virtual StandingData Country { get; set; }

}