本经验目的在于减少EF实际执行的sql命令。
举例:
声明实体
BaseEntity
[Serializable]
public class BaseEntity
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Key]
public string iGuid { get; set; }
public string iCreatedBy { get; set; }
public DateTime iCreatedOn { get; set; }
public string iUpdatedBy { get; set; }
public DateTime iUpdatedOn { get; set; }
public bool iStatus { get; set; }
public bool iIsDeleted { get; set; }
public void NewId()
{
iGuid = Guid.NewGuid().ToString("N");
}
}
SysPage
[Serializable]
[Table("SysPage")]
public class SysPage : BaseEntity
{
public string Name { get; set; }
public string Note { get; set; }
[ForeignKey("CategoryId")]
public SysPageCategory Category { get; set; }
public string PageJson { get; set; }
public string DbJson { get; set; }
}
SysPageCategory
[Serializable]
[Table("SysPageCategory")]
public class SysPageCategory : BaseEntity
{
public string Name { get; set; }
}
其中SysPage的外键是CategoryId,指向SysPageCategory的主键
更新外键的实例
public async Task<(bool, string)> Save(SM_SysPage model)
{
var entity = await _dbContext.SysPages.Include(d => d.Category).FirstOrDefaultAsync(d => d.iGuid == model.iGuid);
var category = new SysPageCategory { iGuid = model.Category.iGuid };
_dbContext.Entry(category).State = EntityState.Unchanged;
if (entity == null)
{
entity = new SysPage
{
iCreatedOn = DateTime.Now
};
entity.NewId();
_dbContext.SysPages.Add(entity);
}
entity.iUpdatedOn = DateTime.Now;
entity.Name = model.Name;
entity.Note = model.Note;
entity.Category = category;
entity.DbJson = model.DbJson;
entity.PageJson = model.PageJson;
var ok = await _dbContext.SaveChangesAsync() > 0;
return (ok, ok ? entity.iGuid : string.Empty);
}
以上步骤避免了SysPage更新Category时去查询SysPageCategory表