문제

I have two objects, channel and business unit channel

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

    [Required, MaxLength(50)]
    public string Name { get; set; }
    public int DashboardConfigurationId { get; set; }
    public ICollection<BusUnitChannel> BusUnitChannels { get; set; }
}

public class BusUnitChannel
{
    public int Id { get; set; }
    public int BusinessUnitId { get; set; }
    public int ChannelId { get; set; }
    public BusinessUnit BusinessUnit { get; set; }
    public Channel Channel { get; set; }
}

when I try try to delete a channel, (i'm using breezejs) I get the error

Error: Failed to save changes to server. The UPDATE statement conflicted with the
FOREIGN KEY constraint "FK_dbo.BusUnitChannels_dbo.Channels_ChannelId". The conflict 
occurred in database "PulseDev", table "dbo.Channels", column 'Id'.

Having read other posts on this topic, I've added the following to my DbContext

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Channel>()
        .HasMany(c=>c.BusUnitChannels)
        .WithRequired(buc=>buc.Channel)
        .WillCascadeOnDelete();
}

What am I doing wrong?

도움이 되었습니까?

해결책

Looks like the override method is not working.

Update your code to:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Channel>()
        .HasMany(c=>c.BusUnitChannels)
        .WithRequired(buc=>buc.Channel)
        .WillCascadeOnDelete();
    base.OnModelCreating(modelBuilder);
}

or better yet; Set the delete cascade rule in your database. That's the way I prefer it.

Edit:

I have tested the code and it worked: Modify BusUnitChannel class as follows:

public class BusUnitChannel
{
    public int Id { get; set; }
    public int BusinessUnitId { get; set; }
    [ForeignKey("Channel")]
    public int ChannelId { get; set; }
    public BusinessUnit BusinessUnit { get; set; }
    public virtual Channel Channel { get; set; }
}

To set a cascade delete in SQL Server:

expand "BusUnitChannel" table; you'll find the FK constraint under "Keys".Right Click then Modify. a dialog will show; expand "Insert and Update specification"change the "Delete Rule" to "Cascade" You can set the update rule as well.

다른 팁

Let's try another way. Remove previous BusUnitChannel declarations and update Channel like this:

modelBuilder.Entity<Channel>()
            .HasMany(c=>c.BusUnitChannels)
            .WithRequired(buc=>buc.Channel)
            .WillCascadeOnDelete(true); # pass true here
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top