2015-09-14 2 views
0

У меня есть три таблицы:Ключ иностранных Нарушений при сохранении с многие ко многим EF6

CREATE TABLE [dbo].[Committees] (
    [committee_id]   INT    IDENTITY (1, 1) NOT NULL, 
    [Committee_name]  NVARCHAR (128) NULL, 
    [Committee_email]  NVARCHAR (128) NULL, 
    [Committee_inactive] INT    NULL, 
    [Committee_type]  NVARCHAR (50) NULL, 
    [Committee_description] NVARCHAR (1024) NULL, 
    [Committee_chair_id] INT    NOT NULL, 
    [Committee_sponsor_id] INT    NOT NULL, 
    [Committee_end_date] DATETIME2 (7) NULL, 
    [bMembershipOpen]  BIT    CONSTRAINT [DF_Committees_bMembershipOpen] DEFAULT ((0)) NOT NULL, 
    CONSTRAINT [PK_Committees] PRIMARY KEY CLUSTERED ([committee_id] ASC), 
    CONSTRAINT [FK_CommitteesChair_ToPersons] FOREIGN KEY ([Committee_chair_id]) REFERENCES [dbo].[Persons] ([Id]), 
    CONSTRAINT [FK_CommitteesSponsor_ToPersons] FOREIGN KEY ([Committee_sponsor_id]) REFERENCES [dbo].[Persons] ([Id]) 
); 

CREATE TABLE [dbo].[Persons] (
    [Id] INT   IDENTITY (1, 1) NOT NULL, 
    [Name] NVARCHAR (128) NULL, 
    [Email] NVARCHAR (128) NULL, 
    CONSTRAINT [PK_Persons] PRIMARY KEY CLUSTERED ([Id] ASC) 
); 

и

CREATE TABLE [dbo].[CommitteeMembers] (
    [CommitteeId] INT NOT NULL, 
    [PersonId] INT NOT NULL, 
    PRIMARY KEY CLUSTERED ([CommitteeId] ASC, [PersonId] ASC), 
    CONSTRAINT [FK_CommitteeMembers_ToCommittee] FOREIGN KEY ([CommitteeId]) REFERENCES [dbo].[Committees] ([committee_id]), 
    CONSTRAINT [FK_CommitteeMembers_ToPerson] FOREIGN KEY ([PersonId]) REFERENCES [dbo].[Persons] ([Id]) 
); 

Я два класса, связанные с комитетами и людьми

public class Committee { 

     [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     [Column("committee_id")] 
     [Key] 
     public int Id { get; set; } 

     [Column("Committee_chair_id")] 
     [ForeignKey("Chairman")] 
     [Required(ErrorMessage = "Committee must have a Chairman")] 
     public int ChairmanId { get; set; } 

     [Column("Committee_sponsor_id")] 
     [ForeignKey("Sponsor")] 
     [Required(ErrorMessage = "Committee must have a Sponsor")] 
     public int SponsorId { get; set; } 

     [Column("Committee_name")] 
     [MinLength(3, ErrorMessage = "Committee Name must be at least 3 characters long")] 
     [MaxLength(128, ErrorMessage = "Committee Name cannot be longer than 128 characters")] 
     [Required(ErrorMessage = "Committee must have a name")] 
     public string Name { get; set; } 

     [Column("Committee_email")] 
     [EmailAddress] 
     [Required(ErrorMessage = "Committee must have an Email Address")] 
     public string Email { get; set; } 

     [Column("Committee_inactive")] 
     public int? Inactive { get; set; } 

     [Column("Committee_type")] 
     [Required(ErrorMessage = "Committee must have a Type")] 
     public string Type { get; set; } 

     [Column("Committee_description")] 
     [MaxLength(1000, ErrorMessage = "Committee Name cannot be longer than 1000 characters")] 
     public string Description { get; set; } 

     [Column("Committee_end_date")] 
     public DateTime? EndDate { get; set; } 

     [Column("bMembershipOpen")] 
     [DefaultValue(false)] 
     [Display(Name="Membership Open")] 
     [Required] 
     public bool MembershipOpen { get; set; } 

     public Person Chairman { get; set; } 

     public Person Sponsor { get; set; } 

     public virtual ICollection<Person> Members { get; set; } 

     public virtual ICollection<Note> Notes { get; set; } 

     public virtual ICollection<NextStep> NextSteps { get; set; } 

     public virtual ICollection<Outcome> Outcomes { get; set; } 

     public virtual ICollection<Video> Videos { get; set; } 
    } 

и

public class Person { 

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    [Required(ErrorMessage = "You must specify a name")] 
    [MaxLength(128, ErrorMessage = "Name cannot be longer than 128 characters")] 
    public string Name { get; set; } 

    [EmailAddress] 
    [MaxLength(128, ErrorMessage = "Email Address cannot be longer than 128 characters")] 
    public string Email { get; set; } 

    public virtual ICollection<Committee> Committees { get; set; } 
} 

и я следующий в моем DbContext

защищены переопределения недействительным OnModelCreating (DbModelBuilder MODELBUILDER) { base.OnModelCreating (MODELBUILDER);

modelBuilder.Entity<Committee>() 
     .HasMany(c => c.Members) 
     .WithMany(m => m.Committees) 
     .Map(m=> { 
      m.ToTable("CommitteeMembers"); 
      m.MapLeftKey("PersonId"); 
      m.MapRightKey("CommitteeId"); 
     }); 

    modelBuilder.Entity<Committee>() 
     .HasMany(c => c.Notes) 
     .WithRequired(n => n.Committee); 

    modelBuilder.Entity<Committee>() 
     .HasMany(c => c.NextSteps) 
     .WithRequired(n => n.Committee); 

    modelBuilder.Entity<Committee>() 
     .HasMany(c => c.Outcomes) 
     .WithRequired(o => o.Committee); 

    modelBuilder.Entity<Committee>() 
     .HasMany(c => c.Videos) 
     .WithRequired(v => v.Committee); 

    modelBuilder.Entity<Committee>() 
     .HasRequired(c => c.Chairman); 

    modelBuilder.Entity<Committee>() 
     .HasRequired(c => c.Sponsor); 

    modelBuilder.Entity<Person>() 
     .Map(t => t.ToTable("Persons")); 
} 

Все мои навигационные свойства работают над моими моделями, за исключением Комитета. Члены и лица. Комитеты. Всякий раз, когда я пытаюсь сохранить DbContext после добавления лица в комитет или Комитет Лицу я получаю сообщение об ошибке, как следующее:

Заявления INSERT конфликтного с ограничением FOREIGN KEY «FK_CommitteeMembers_ToCommittee». Конфликт произошел в базе данных «EquipNetCommitteeDb», в таблице «dbo.Committees», в столбце «Committee_id». Заявление было прекращено.

Кто-нибудь знает, что я делаю неправильно? Это должно сработать. Я делал это много раз раньше, и я думаю, что мне просто нужен еще один взгляд на него.

ответ

1

Похоже, что Entity Framework не понравилось, что я уже создал внешние ключи в таблице членов Комитета. Как только я удалил их и позволю Entity Framework управлять отношениями, с которыми он работал. Я не уверен, что так оно и должно работать. Если кто-нибудь знает что-нибудь о том, почему я не мог указать внешние ключи в определении таблицы, мне было бы интересно узнать ответ.

+2

Я думаю, что некоторые из создателей сущности выбрали «упростить» понятие внешних ключей и отношений между двумя сущностями. Они хотят, чтобы Entity автоматически определял отношения между объектом. Я не могу объяснить это очень хорошо, так как я не знаю многое из того, что происходит изнутри рамки, но здесь: http://www.ladislavmrnka.com/2011/05/foreign-key-vs-independent-associations-in -ef-4/ –

+1

Какой замечательный ответ. Этот пост содержал очень ясное объяснение того, почему то, что я делал, хотя и технически корректно, не соответствовало тому, как Entity Framework ожидает от меня работы. Большое спасибо. –

Смежные вопросы