在我的方案中,我有2个实体Estate
和EstateCategory
,其中每个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
获取新值,则效果良好。
我对这个问题一无所知。