框架:我正在使用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”引用。
答案 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
实例,而不是再次从数据库中获取它。