我想更新具有计算列的实体。不幸的是,我收到了SqlException
:
SqlException:Column' inserted.OpenCount'无法在OUTPUT子句中引用,因为列定义包含子查询或引用执行用户或系统数据访问的函数。默认情况下,如果函数不是模式绑定,则假定该函数执行数据访问。请考虑从列定义中删除子查询或函数,或从OUTPUT子句中删除该列。
当我尝试这样做时:
[HttpGet("{id:int}/[action]")]
public async Task<IActionResult> SetPublished(int id, string returnUrl)
{
// load article
var article = await Data.Articles.SingleOrDefaultAsync(r => r.Id == id);
if (article == null)
return HttpNotFound();
// toggle published
if (!article.IsPublished)
article.IsPublished = true;
else
article.IsPublished = false;
await Data.SaveChangesAsync();
// redirect
if (returnUrl != null)
return LocalRedirect(returnUrl);
return RedirectToAction(nameof(Index));
}
我确实尝试使用[NotMapped]
属性排除此列,但这没有帮助。
有没有办法在不改变数据库结构的情况下修复它?
以下是此列的声明方式:
[Table("Articles")]
public class Article : IdEntity
{
/// <summary>
/// Gets or sets publish date and time.
/// </summary>
[DataType(DataType.DateTime)]
[Display(Name = "Дата публикации")]
public virtual DateTime Date { get; set; }
/// <summary>
/// Gets or sets article name.
/// </summary>
[Display(Name = "Название")]
[Required(ErrorMessage = "Введите название")]
[MaxLength(50, ErrorMessage = "Название должно быть не более 50 символов")]
public virtual string Name { get; set; }
/// <summary>
/// Gets or sets URL name.
/// </summary>
[Display(Name = "Название в URL")]
[MaxLength(50, ErrorMessage = "Название в URL должно быть не длиннее 50 символов")]
[RegularExpression(RegexConstants.UrlName, ErrorMessage = "Название в URL может содержать только символы латинского алфавита, цифры, символы тире и подчеркивания")]
public virtual string UrlName { get; set; }
/// <summary>
/// Gets or sets article full text.
/// </summary>
[Display(Name = "Текст")]
[Required(ErrorMessage = "Введите текст")]
public virtual string Text { get; set; }
/// <summary>
/// Gets or sets if article is published. If not when one should not be available on public website.
/// </summary>
[Display(Name = "Опубликована")]
public virtual bool IsPublished { get; set; }
/// <summary>
/// Gets nubmer of article opens.
/// </summary>
[NotMapped]
[Display(Name = "Количество открытий")]
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public virtual int OpenCount { get; protected set; }