Ciaran Gallagher
Ciaran Gallagher

Reputation: 4020

Deleting association between one or zero to one entities with EntityFramework

I have entities set up something like this:

public class MyThing
{
    public int Id { get; set; }
    public virtual MyOtherThing { get;set; }
}

public class MyOtherThing
{
    public int Id { get; set; }
    public virtual MyThing MyThing { get; set; }
}

My intention is that 'MyThing' can have one or none of MyOtherThing, and I also want a navigation link from MyOtherThing to it's parent.

I have configured the following EntityBaseConfiguration for the 'MyOtherThing' entity:

this.HasOptional(x => x.MyThing)
    .WithOptionalPrincipal(x => x.MyOtherThing);

I can assign and modify MyOtherThing to MyThing no problem, but when I want to unassign 'MyOtherThing' from 'MyThing', how do I do this?

I tried the following:

myThing.MyOtherThing = null;

and then editing the entity by setting the EntityState.Modified state, but this didn't remove the association between the entities.

I tried adding the following to my MyThing entity, but this resulted in an EF 'Multiplicity is not valid' error when updating my database model:

public int? MyOtherThingId{ get; set; }

Thanks in advance!

Upvotes: 1

Views: 47

Answers (1)

Gert Arnold
Gert Arnold

Reputation: 109109

I tried the following:

myThing.MyOtherThing = null;

If you want to remove an optional dependent entity (here: MyOtherThing) from a principal entity (here MyThing) by setting it to null, you have to pull the entity from the database with the dependent entity included, for example:

var mything = context.MyThings.Include(m => m.MyOtherThing)
              .Single(t => t.Id == idValue);

(It's also OK when the belonging MyOtherThing is loaded into the context later, for example by lazy loading).

Without Include, myThing.MyOtherThing already is null and EF doesn't detect any change. Note that the statement myThing.MyOtherThing = null; doesn't execute lazy loading, which is a bit confusing because with collections the behavior is different.

By the way, the dependent entity can also be removed from the database directly, which is more efficient.

var ot = context.Set<MyOtherThing>().Find(idValue);
context.Set<MyOtherThing>().Remove(ot);
context.SaveChanges();

Upvotes: 2

Related Questions