I am having a weird issue with my understanding of Entity Framework. It's likely something I am doing wrong.
I have the following sample objects recording as data in my SQL Database.
public class Competition
{
public long Id { get; set;}
public string Name { get; set; }
}
public class SeasonCompetition
{
public long Id { get; set;}
public string Name { get; set; }
public Competition Competition { get; set; }
}
Now, I create a new instance of Competition
and save it to the database.
I then create a new instance of SeasonCompetition
relating to the created Competition
.
Competition competition = new Competition();
competition.Name = "Test";
_context.Add(competition);
_context.SaveChanges();
SeasonCompetition seasoncompetition = new SeasonCompetition();
seasoncompetition.Name = "Test Season Comp";
seasoncompetition.Competiton = competition;
_context.Add(seasoncompetition);
_context.SaveChanges();
This successfully writes a record to the SeasonCompetitions
table looking a bit like this.
Id | Name | SeasonCompetitionId |
---|---|---|
1 | Test Season Competition | 1 |
Now, I want to remove the relationship so this SeasonCompetition
does not relate to the Competition
record
seasoncompetition.Competition = null;
_context.Update(seasoncompetition);
_Context.SaveChanges();
If I put a breakpoint in and examine the seasoncompetition
object after SaveChanges()
, I can see seasoncompetition.Competition = null
, but looking at the database, it still shows this.
Id | Name | SeasonCompetitionId |
---|---|---|
1 | Test Season Competition | 1 |
How to I update the SeasonCompetition
record to remove the relationship to Competition
but still keep the Competition
record in place? in the database?
Using Visual Studio 2022 and .NET 5
CodePudding user response:
Make 'Competition' nullable.
public class SeasonCompetition
{
public long Id { get; set; }
public string Name { get; set; }
public Competition? Competition { get; set; }
}
CodePudding user response:
There are two ways to remove a record from SQL using using entity framework, detach or remove.
Competition competition = new Competition();
competition.Name = "Test";
_context.Add(competition);
_context.SaveChanges();
SeasonCompetition seasoncompetition = new SeasonCompetition();
seasoncompetition.Name = "Test Season Comp";
seasoncompetition.Competiton = competition;
_context.Add(seasoncompetition);
_context.SaveChanges();
_context.Entry(competition).State = EntityState.Deleted;
_context.SaveChanges();
Alternatively you could use remove like this:
_context.Competitions.Remove(competition);
_context.SaveChanges();
The difference of detach vs remove in EF:
Remove: mark the entity to be deleted so when you do SaveChanges it's deleted from the db
Detach: remove the entity from the DbContext change tracker so whatever you do with the entity DbContext doesn't notice. So when you do SaveChanges nothing happens with this entity