首先,我对实体框架和webapi相对较新,但是,我目前正在写一个娱乐活动,涉及一个人能够创建主"商业"帐户的人这能够创建"业务"并将子帐户创建并附加给他们。有单独的表可以跟踪在企业帐户中创建的业务以及附属于这些业务的工人的清单。
给定以下类/代码:
商务舱:
public class Business
{
public int Id { get; set; }
public string BusinessAccount { get; set; }
public string BusinessName { get; set; }
public List<Worker> Workers { get; set; }
}
SchedulerDbContext:
public class SchedulerDbContext : DbContext
{
public SchedulerDbContext()
: base("SchedulerDbContext")
{
}
public virtual DbSet<Business> Businesses { get; set; }
public virtual DbSet<Worker> Workers { get; set; }
}
BusinessController :(仅显示相关部分)
[Route("Create")]
public IHttpActionResult Create(string name)
{
if (String.IsNullOrWhiteSpace(name))
{
ModelState.AddModelError("BusinessNameError", "Invalid Business Name Entered.");
return BadRequest(ModelState);
}
Business business = new Business()
{
BusinessName = name,
BusinessAccount = User.Identity.Name,
Workers = new List<Worker>() //<----a
};
using (var db = new SchedulerDbContext())
{
db.Businesses.Add(business); //<----b
db.SaveChanges();
}
return Ok(business);
}
usercontroller :(仅相关部分)
[Route("Register")]
public async Task<IHttpActionResult> Register(UserModel userModel)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
AccountUser user = new AccountUser
{
UserName = userModel.UserName,
Email = userModel.Email,
BusinessAccount = User.Identity.Name
};
IdentityResult result = await this.SchedUserManager.RegisterUser(user, userModel);
IHttpActionResult errorResult = GetErrorResult(result);
if (errorResult != null)
{
return errorResult;
}
result = await this.SchedUserManager.AddToRoleAsync(user.Id, defaultRole);
errorResult = GetErrorResult(result);
if (errorResult != null)
{
return errorResult;
}
using (var db = new SchedulerDbContext())
{
var query = from record in db.Businesses
where record.Id == userModel.BusinessId
select record;
var business = query.First();
var worker = new Worker()
{
FirstName = userModel.FirstName,
LastName = userModel.LastName,
Email = userModel.Email
};
if (business.Workers == null) { business.Workers = new List<Worker>(); } //<----c
business.Workers.Add(worker); //<----d
db.SaveChanges();
}
return Ok();
}
现在没有代码。我用箭头标记了多个斑点。现在我的问题是...
在BusinessController的create()函数中创建busines时,我为工人属性分配了一个新列表,如//&lt; ----- a。因此,在那之后,将其添加到//&&&&b的SchedulerDbContext和保存的更改中。
现在,在创建一个用户帐户以在UserController的register()函数中附加到该业务的用户帐户时,我会遇到问题。如果在箭头//--- d上运行该行,则在没有线路的情况下完成了//&lt; ---- c存在,我将获得NullReferenceException。
我很好奇的是,为什么在//&lt; ---- a没有解决这个问题的原因?我很确定没有技术分配的记录,但是检查它是否为空(例如//&lt; ----- c)处理它的最干净的方法?我的一部分想象的是EF为我神奇地处理这一点。有没有更好的办法?在我看来,如果它是空的,那似乎是一个奇怪的地方,就像应该在其他地方完成的那样。
,因为ef默认情况下不会加载所有外排行。您要么需要明确告诉它加载工人,要么启用该属性的懒惰加载。
明确加载:
var query = from record in db.Businesses
where record.Id == userModel.BusinessId
select record;
var business = query.Include("Workers").First();
// ^^^^^^^^^^^^^^^^^^
允许懒惰的加载来解决这种关系:
public virtual List<Worker> Workers { get; set; }
// ^^^^^^^