我可以阻止EF CF尝试修改数据库中的“身份”列吗?不支持“修改具有'标识'模式的列。”

时间:2015-03-15 16:36:19

标签: c# asp.net-mvc ef-code-first entity-framework-6

我的域名中有一对多的关系,类似于以下内容:

public class Movie
{
    public int MovieID { get; set; }
    public string MovieName { get; set; }      

    public virtual ICollection<MovieCategory> Categories { get; set; }
}

public class MovieCategory
{
    [Key, ForeignKey("Movie")]
    public int MovieID { get; set; }

    [Key, ForeignKey("Category")]
    public int CategoryID { get; set; }

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public DateTime DateCreated { get; set; }

    public virtual Movie Movie { get; set; }
    public virtual Category Category { get; set; }
}

在插入新电影(并在一堆复选框中检查某些类别)时,通过GETDATE()在SQL中设置DateCreated字段。那部分工作正常。

然而,在编辑电影时,我需要能够更新电影类别的选择(这意味着根据用户在复选框中选择的内容添加一些和/或删除其他类别)。我试过这个:

public ActionResult Edit(MovieEditViewModel model)
{
    var movie = db.Movies.Find(model.MovieID);

    //clear out all previously selected categories
    movie.Categories.Clear();

    //add the list of selected categories from just-edited movie
    foreach(var catID in model.selectedCategories)
    {
        movie.Categories.Add(new MovieCategory { CategoryID = catID });
    }

    db.Entry(movie).State = EntityState.Modified;
    db.SaveChanges();
}

我认为EF很聪明,可以确定哪些类别需要删除,哪些类别需要添加,哪些需要修改。

唯一的问题是,对于它正在修改的那些,它会尝试修改每个字段,包括DateCreated字段,因为在插入过程中只应该触摸它(即&#39; Identity&# 39;),它会导致此错误:

"Modifying a column with the 'Identity' pattern is not supported. Column: 'DateCreated'. Table: 'CodeFirstDatabaseSchema.MovieCategory'."

我有什么想法可以解决这个问题? 我试图做的就是允许有人编辑电影,其中可能会或者可能不会在编辑期间修改电影类别列表,并且DB中的表MovieVategory需要准确地反映编辑的选择。

我也试过添加这个,但没有变化:

foreach(var category in movie.Categories)
{
    db.Entry(category).Property(c => c.DateCreated).IsModified = false;
}

1 个答案:

答案 0 :(得分:4)

DatabaseGeneratedOption.Identity用于标识列。这些也是自动生成的,但它们永远不会被修改,因为这些列通常用作主键。

您应该将选项更改为

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime DateCreated { get; set; }

执行此操作时,EF将忽略insert和update语句中的属性,并在这些语句之后立即从数据库中读取其值。

如果你这样做,你的代码应运行正常。

旁注,声明

db.Entry(movie).State = EntityState.Modified;

是多余的,因为它只影响movie的标量属性,而不影响其Categories。并且movie本身未被修改。