使用计算列更新实体时出错

时间:2015-12-25 08:24:51

标签: c# sql entity-framework ef-code-first

我想更新具有计算列的实体。不幸的是,我收到了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; }

0 个答案:

没有答案