实体框架代码首先删除没有父实体的实体

时间:2012-10-27 13:42:55

标签: entity-framework entity-framework-4.1 ef-code-first cascade

我有两个实体用户和手机。关系是一对一的。映射是

public class User 
{
    public virtual Phone Phone { get; set;}

    public virtual int PhoneId { get; set;}
}

public class Phone 
{
    public virtual string Number { get; set;}
}

我对用户的映射是:

HasRequired(x => x.Phone).WithMany().HasForeignKey(x => x.PhoneId)

我有分配电话的用户。 f.e。

Phone oldPhone = new Phone();
Phone newPhone = new Phone();
User user = new User();
user.Phone = old;

///Save user with phone.

user.Phone = newPhone;
///Save user  with phone.

现在我的用户已经分配了手机 - newPhone而没有在数据库中分配oldPhone行。

如何设置映射以删除没有父项的实体(oldPhone)。

编辑。

我已根据this文章更改了地图

 HasRequired(x => x.Phone).WithOptional();

对于保存,我使用此方法:

public override void Save(TEntity entity)
        {
            if (entity == null)
            {
                throw new ArgumentNullException("entity");
            }

            if (entity.Id > 0)
            {
                DbContext.Set<TEntity>().Attach(entity);
                DbContext.Entry(entity).State = System.Data.EntityState.Modified;
            }
            else
            {
                DbContext.Set<TEntity>().Add(entity);   
            }            
        } 

当我附加新实体时,旧的实体不会从DB中删除,因此在我的示例中,我在DB oldPhone和newPhone中有两个实体。

1 个答案:

答案 0 :(得分:1)

我不知道通过EF中的映射来实现这一目的。对于我的一个项目,我创建了一个Parent属性,我可以在Save上查看。我想你可以在这里使用它。我用这个代码发了一篇博文。 extending entity framework 4 with parentvalidator。 它需要将User属性添加到Phone实体。

[Parent]
public virtual User User { get; set;}