尝试在保存父项后包含一对多关系项时出现NullReferenceException

时间:2011-08-07 22:09:51

标签: entity-framework asp.net-mvc-3

框架:我正在使用MVC 3 + EntityFramework 4.1 Code-First。

概念:一个立法实体有许多供应实体。这个想法是用户输入一个立法实体,然后保存它的功能将其传递给另一个函数,以查看该立法是否有ShortTitle。如果是,则将其格式化为正确措辞的字符串,并将其包含在立法的第一个配置中,然后将更改保存到数据库。

问题:问题是,我尝试用不同的方式对其进行编码,我不断收到NullReferenceException,告诉我用“new”关键字创建一个新的对象实例,并指出我在我的第二个函数中的savedLegislation.Provisions.Add(provision);行。

以下是有争议的两项职能,第一项是妥善保存立法:

public Legislation Save(NewLegislationView legislation)
{
    Legislation newLegislation = new Legislation();
    // Simple transfers
    newLegislation.ShortTile = legislation.ShortTile;
    newLegislation.LongTitle = legislation.LongTitle;
    newLegislation.BillType = legislation.BillType;
    newLegislation.OriginatingChamber = legislation.OriginatingChamber;
    newLegislation.Preamble = legislation.Preamble;

    // More complicated properties
    newLegislation.Stage = 1;
    this.NumberBill(newLegislation); // Provides bill number
    newLegislation.Parliament = db.LegislativeSessions.First(p => p.Ending >= DateTime.Today);
    newLegislation.Sponsor = db.Members.Single(m => m.Username == HttpContext.Current.User.Identity.Name);

    // And save
    db.Legislations.Add(newLegislation);
    db.SaveChanges();

    // Check for Short titles
    this.IncludeShortTitle(newLegislation);

    // return the saved legislation
    return newLegislation;
}

第一个调用的第二个函数处理检查ShortTitle是否为空并创建与该立法相关的Provision,然后保存更改。

public void IncludeShortTitle(Legislation legislation)
{
    var savedLegislation = db.Legislations.Find(legislation.LegislationID);
    if (savedLegislation.ShortTile.Any() && savedLegislation.ShortTile.ToString().Length >= 5)
    {
        string shortTitle = "This Act may be cited as the <i>" + savedLegislation.ShortTile.ToString() + "</i>.";
        var provision = new Provision()
        {
            Article = Numbers.CountOrNull(savedLegislation.Provisions) + 1,
            Proponent = savedLegislation.Sponsor,
            Text = shortTitle
        };
        savedLegislation.Provisions.Add(provision);
        db.SaveChanges();
    }
}

我一直在研究SaveChanges()如何工作以及它是否正确地返回更新后的实体,它确实如此(因为我在第二个函数中没有遇到任何问题)。如果它正常工作,并且找到了法规并且在第二个函数中新创建了该条款,我看不出它一直在吐出的“null”引用。

1 个答案:

答案 0 :(得分:0)

在这种情况下,空引用将是savedLegislation.Provisions。当EF从Provisions方法返回List<Provision>个实例时,Legislation集合不会初始化为新的db.Legislations.Find(...)

我尝试的第一件事是这样的:

var savedLegislation = db.Legislations
    .Include("Provisions")
    .First(l => l.LegislationID == legislation.LegislationID);

...但我也考虑使用传递给方法的legislation实例,而不是再次从数据库中获取它。