0

I have a Video class and a MediaContent class that are linked by a 1-1, required:required relationship: each Video must have exactly 1 associated MediaContent. Deleting a MediaContent object must result in the deletion of the associated Video object.

Using the fluent API, the relationship can be modeled as follows:

modelBuilder.Entity<Video.Video>()
            .HasRequired(v => v.MediaContent).WithRequiredPrincipal(mc => mc.Video)
            .WillCascadeOnDelete(true);

When adding a migration to reflect this change in the database, this is how the relationship gets transcribed in terms of foreign keys:

AddForeignKey("MediaContents", "MediaContentId", "Videos", "VideoId", cascadeDelete: true);

Updating the database, I get the following error:

Cascading foreign key 'FK_MediaContents_Videos_MediaContentId' cannot be created where the referencing column 'MediaContents.MediaContentId' is an identity column.

Dropping the WillCascadeOnDelete(true) property removes the error, but I'm not sure I understand why. Shouldn't the error appear whether or not cascading is turned on? The way I understand the problem, the error comes from the fact that the generation of VideoId and MediaContentId is handled by auto-increment (or by whatever the id generation strategy is), potentially contradicting the foreign key constraint. But I can't see what this has to do with delete-cascading...

What am I missing? More generally, how would you go about modeling a cascadable one-to-one, required:required relationship with EF?

guidupuy
  • 505
  • 3
  • 15

1 Answers1

0

I avoid the modelBuilder cruft approach and use simple POCOs and attributes generally - which you can use to accomplish your goals like so:

public class Video
{
    public int Id { get; set; }

    // Adding this doesn't change the db/schema, but it is enforced in code if
    // you try to add a Video without a MediaContent.
    [Required]
    public MediaContent MediaContent { get; set; }
}

public class MediaContent
{
    [ForeignKey("Video")]
    public int Id { get; set; }

    public Video Video { get; set;}
}
Chris Moschini
  • 36,764
  • 19
  • 160
  • 190