2014-02-05 24 views
0

我有一个与费用期间有必要关系的费用实体。它的定义如下:缺少字段的实体框架验证错误,但它不会丢失?

public class UserExpense 
{ 
    [Key] 
    public virtual int ExpenseId { get; set; } 

    [Required] 
    public virtual DateTime DateIncurred { get; set; } 

    [Required] 
    public virtual DateTime DateAdded { get; set; } 

    [Required] 
    public virtual DateTime LastModified { get; set; } 

    [Required] 
    public virtual ExpenseType ExpenseType { get; set; } 

    [Required] 
    public virtual string Title { get; set; } 

    public virtual string Comment { get; set; } 

    public virtual decimal TotalAmount { get; set; } 

    [Required] 
    public virtual UserExpensePeriod ExpensePeriod { get; set; } 

    public virtual Project Project { get; set; } 

    public virtual IList<ExpenseReceipt> Receipts { get; set; } 

    public virtual ObjectStatus Status { get; set; } 
} 

当我加入一个新的开支,我有一个查找到的费用适用,或创建一个新的时期,并返回它的存续期间的方法。这是代码:

public UserExpensePeriod CreateOrGetExpensePeriod(int userId, DateTime date) 
{ 
    var existing = _context.UserExpensePeriods.FirstOrDefault(e => e.User.UserId == userId && e.StartDate <= date && e.EndDate >= date); 
    if (existing != null) 
    { 
     return existing; 
    } 

    var user = _context.Users.FirstOrDefault(u => u.UserId == userId); 
    var newPeriod = new UserExpensePeriod() 
    { 
     StartDate = new DateTime(date.Year, date.Month, 1), 
     EndDate = new DateTime(date.Year, date.Month, DateTime.DaysInMonth(date.Year, date.Month)), 
     Status = ExpenseStatus.Draft, 
     Name = date.ToString("MMMM") + " " + date.Year.ToString(), 
     User = user 
    }; 

    _context.UserExpensePeriods.Add(newPeriod); 
    return newPeriod; 
} 

以下是创建新费用的方法。映射服务是Automapper的抽象。 MileageExpense基于费用:

public void CreateMileageExpense(MileageExpenseViewModel model, int createdByUserId, string ipAddress, string userAgent) 
{ 
    var user = _unitOfWork.UserRepository.GetById(createdByUserId); 

    var expense = _mappingService.Map<MileageExpenseViewModel, MileageExpense>(model); 
    expense.DateAdded = DateTime.UtcNow; 
    expense.LastModified = expense.DateAdded; 
    expense.ExpensePeriod = _unitOfWork.ExpenseRepository.CreateOrGetExpensePeriod(createdByUserId, expense.DateAdded); 
    expense.DistanceMeasurement = user.Company.Jurisdiction.DistanceMeasurement; 
    expense.EngineSize = _unitOfWork.CompanyRepository.GetEngineSize(model.EngineSizeId); 
    expense.MileageRatesApplied = CalculateMileageAmountByEngineSize(expense); 

    if (model.SelectedProjectId.HasValue) 
    { 
     expense.Project = _unitOfWork.ProjectRepository.GetById(model.SelectedProjectId.Value); 
    } 

    _unitOfWork.ExpenseRepository.AddMileageExpense(expense); 
    _unitOfWork.SaveChanges();   

} 

当我调试,我可以看到,这个方法返回正确的时间(在这种情况下,它不会创建为一个已经存在)。

然后我将新开支添加到数据上下文DbSet。当我保存更改时,出现一个错误,告诉我ExpensePeriod是必填字段。

有谁知道为什么会发生这种情况? Pk被填充,当我使用依赖注入时,检索和添加在同一个上下文中完成。

非常感谢您的帮助, 约翰

+1

表明调用'CreateOrGetExpensePeriod(...)'和创建/保存完成新的'Expense' – Moho

+0

的代码。感谢您的期待 –

+0

如何返回_context.UserExpensePeriods.Add(newPeriod)'?此外,根据您提交的时间,检查'_context.UserExpensePeriods.Local'和'_context.UserExpensePeriods'是否合理。 –

回答

0

你试过保存和commiting的UserExpensePeriods对象添加UserExpense过吗?

_context.SaveChanges(true); 
_context.AcceptAllChanges(); 
+0

嗨菲利普,当我调试没有新的时期添加为一个已经存在,所以没有什么可提交。 –