我是实体框架新手,无法弄清楚为什么存储库总是为其相应的外键表创建新条目?
这是示例:在
GeoLocationType
表中,我向 Classification
表添加了一个名为 Classification_ID
的外键。
我的模型是:
public partial class GeoLocationType : BaseEntity
{
public YesNoEnum? IsActive { get; set; }
public YesNoEnum? IsAutoStoreLocation { get; set; }
public virtual Classification classification { get; set; }
}
public partial class Classification : BaseEntity
{
public string code { get; set; }
}
现在,每当我保存
GeoLocationType
时,它也会在 Classification
表中创建一个新条目。
代码:
if (model.Classifications_Id > 0)
{
model.Classifications = _ClassificationRepository
.Find(p => p.Id == model.Classifications_Id)
.FirstOrDefault();
}
var entity = Mapper.Map<GeoLocationType>(model);
Validate(entity);
_GeoLocationTypeRepository.Add(entity);
_uow.SaveChanges();
其中
model
是具有 Classifications_Id
的视图模型。
调用
_uow.SaveChanges();
后,它会在 Classification
表中创建一个新条目,并选择它的 primary_key
添加到 GeoLocationType
表中。不知道为什么会发生这种情况,因为 model.Classifications_Id
已经存在于 Classification
表中。
任何帮助将不胜感激。
在将分类实体设置为 GeoLocationType 实体之前,尝试使用 Attach 方法附加分类实体
if (model.Classifications_Id > 0)
{
var classification = _ClassificationRepository
.Find(p => p.Id == model.Classifications_Id).FirstOrDefault();
_uow.Attach(classification);
model.Classifications = classification;
}
当您在 ef 中调用 _GeoLocationTypeRepository.Add(entity) 时,它将知道分类实体已存在于 db 中,并将使用它而不是创建新实体。
将
bool tracked = false
添加到 IRepository
和 Repository
文件中的方法
I存储库:
void AddProductInCart(ShoppingCart shoppingCart, bool tracked = false);
存储库:
public void AddProductInCart(ShoppingCart shoppingCart ,bool tracked=false)
{
if (tracked)
{
_dbContext.shoppingCart.Add(shoppingCart);
_dbContext.SaveChanges();
}
}