Rob Bowman
Rob Bowman

Reputation: 8711

EF update is inserting and into a different table

I have an MVC 5 website using EF6 code first.

The website will track golf results at events.

Here are my pocos:

public class Event
    {
        public int EventId { get; set; }
        public string VenueName { get; set; }
        public string CourseName { get; set; }
        public String FirstTeeOff { get; set; }
        public DateTime EventDate { get; set; }
        public decimal Fee { get; set; }
        public virtual ICollection<Result> Results { get; set; }
    }

public class Golfer
    {
        public int GolferId { get; set; }
        public string FirstName { get; set; }
        public string Surname { get; set; }
        public int CurrentHandicap { get; set; }
        public string Email { get; set; }
        public string Telephone { get; set; }
        public virtual ICollection<Result> Results { get; set; }
    }

public class Result
    {
        public int ResultId { get; set; }
        public Golfer Golfer { get; set; }
        public Event Event { get; set; }
        public bool Attendance { get; set; }
        public int HandicapPlayed { get; set; }
        public int ScoreCarded { get; set; }
        public int LongestDriveWins { get; set; }
        public int NearestPinWins { get; set; }

        public Result()
        {
            Event = new Event();
            Golfer = new Golfer();
        }
    }

The POST edit action for my Result is as follows:

[HttpPost]
        [Authorize]
        public ActionResult Edit(ResultViewModel resultVM)
        {
            try
            {
                DomainClasses.Result resultDomain = _context.Results.Find(resultVM.GolferResults[0].ResultId);


                resultDomain.Attendance = resultVM.GolferResults[0].Attendance;
                resultDomain.HandicapPlayed = resultVM.GolferResults[0].HandicapPlayed;
                resultDomain.ScoreCarded = resultVM.GolferResults[0].ScoreCarded;
                resultDomain.LongestDriveWins = resultVM.GolferResults[0].LongestDriveWins;
                resultDomain.NearestPinWins = resultVM.GolferResults[0].NearestPinWins;


                _context.Results.Attach(resultDomain);
                _context.SaveChanges();

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

I'm getting an error on the SaveChanges. I've used EF Profiler and it showed that it was trying to insert into the Event table:

INSERT [dbo].[Events]
       ([VenueName],
        [CourseName],
        [FirstTeeOff],
        [EventDate],
        [Fee])
VALUES (NULL,
        NULL,
        NULL,
        '0001-01-01T00:00:00' /* @0 */,
        0 /* @1 */)



SELECT [EventId]
FROM   [dbo].[Events]
WHERE  @@ROWCOUNT > 0
       AND [EventId] = scope_identity()

Any idead why?

Upvotes: 0

Views: 31

Answers (1)

Slauma
Slauma

Reputation: 177133

It's most likely because you create instances of the related entities in the Result constructor:

Event = new Event();
Golfer = new Golfer();

Remove those lines from the constructor.

Upvotes: 3

Related Questions