为什么DbContext.Entry将外键设置为null?

时间:2014-06-12 12:54:10

标签: c# entity-framework-6

在我的方案中,我有2个实体EstateEstateCategory,其中每个Estate与带有外键EstateCategory的{​​{1}}有关系。在我的存储库中,我有这个代码来更新实体:

CategoryId

我的实体看起来像这样:

//_dbSet is a DbSet<T>
public virtual void Update(T entity)
{
            if (entity == null)
            { throw new ArgumentNullException(); }

            var entry = _dbContext.Entry(entity);

             _dbSet.Attach(entity);

            entry.State = EntityState.Modified;
}

在FluentApi映射中,我编写了此代码以创建public class Estate { public int Id{set;get;} public string Title {set;get;} public decimal MeterPrice {set;get;} public int? CategoryId {set;get;} public virtual EstateCategory EstateCategory{set;get;} } public class EstateCategory{ public int id{set;get;} public string Title{set;get;} public virtual ICollection<Estate> Estates{set;get;} public EstateCategory() { this.Estates = new HashSet<Estate>(); } } Estate之间的关系:

EstateCategory

public partial class Estate_Mapping : EntityTypeConfiguration<Estate> { public Estate_Mapping() { this.HasRequired(t => t.EstateCategory).WithMany(t => t.Estates).HasForeignKey(d => d.CategoryId); } } 传递给存储库的Estate方法时,如果Update有值(如600)但CategoryId为空,则声明

EstateCategory

自动将var entry = _dbContext.Entry(entity) 设置为null。

数据库返回此异常:

  

无法将值NULL插入列&#39; CategoryId&#39;,table&#39; amlakdb3.dbo.Estates&#39 ;;列不允许空值。更新失败

如果我将CategoryId的{​​{1}}类型从CategoryId转换为Estate,那么int?语句(来自存储库中的int方法抛出异常:

  

操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。

在表示层中,我有一个名为_dbSet.Attach(entity)的{​​{1}}类的副本。我有一个可以将对象复制到另一个对象的函数,它可以将实体框架实体复制到viewmodel。该名称为Update

在mvc动作中,我更新遗产的代码是:

Estate

如果EstateModel具有较旧的值,则此代码会抛出异常,但如果simpleModelMapper获取新值,则效果良好。

我对这个问题一无所知。

0 个答案:

没有答案