实体框架代码首先是双重一对一的关系

时间:2012-04-27 08:05:01

标签: entity-framework-4.1 ef-code-first navigation-properties

class Event{  
    int? EventID{get;set;}  
    int? FirstParticipantID{get;set;}  
    Participant FirstParticipant{get;set;}  
    int? SecondParticipantID{get;set;}  
    Participant SecondParticipant{get;set;}  
    int? CreatedByID{get;set;}  
    User CreatedBy{get;set;}  
}


class Participant{  
    int? ParticipantID{get;set;}  
    List<Event> Events{get;set;}  
    int? CreatedByID{get;set;}  
    User CreatedBy{get;set;}  
}

protected override void OnModelCreating(DbModelBuilder modelBuilder){  
    modelBuilder.Entity<Event>().HasRequired(m => m.FirstParticipant).WithMany(m => m.Events).HasForeignKey(m => m.FirstParticipantID);  
    modelBuilder.Entity<Event>().HasRequired(m => m.SecondParticipant).WithMany(m => m.Events).HasForeignKey(m => m.SecondParticipantID);  
    modelBuilder.Entity<Event>().HasRequired(m => m.CreatedBy);  
    modelBuilder.Entity<Participant>().HasRequired(m => m.CreatedBy);  
}

对我来说似乎很清楚,但是EF(和sql)一直在抱怨,无论我对hasmanny / hasrequired的东西做了什么动作。我甚至找不到谷歌帮助因为我不知道我正在尝试实施的名称(双一对一??? !!!)

这个想法是一个事件必须有2个非空参与者(仅限第一个和第二个,不是很多)并且每个参与者可能有许多事件

由于

1 个答案:

答案 0 :(得分:2)

您的代码中存在多个问题:

  • PK无法入罪
  • 如果要将关系定义为必需
  • ,则FK无法为空
  • 当您使用Participant定义两个关系时,您需要两个导航属性 - 您无法将两个关系映射到单个Events属性
  • 您未在CreatedByEvent
  • 中完成Participant的映射

试试这个:

public class Event{  
    public int EventID {get;set;}  
    public int FirstParticipantID{get;set;}  
    public Participant FirstParticipant{get;set;}  
    public int SecondParticipantID{get;set;}  
    public Participant SecondParticipant{get;set;}  
    public int CreatedByID{get;set;}  
    public User CreatedBy{get;set;}  
}


public class Participant{  
    public int ParticipantID {get;set;}   
    public int CreatedByID {get;set;}  
    public User CreatedBy {get;set;}  
    public ICollection<Event> FristEvents { get; set; }
    public ICollection<Event> SecondEvents { get; set; }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder){  
    modelBuilder.Entity<Event>()
                .HasRequired(m => m.FirstParticipant)
                .WithMany(m => m.FirstEvents)
                .HasForeignKey(m => m.FirstParticipantID);  
    modelBuilder.Entity<Event>()
                .HasRequired(m => m.SecondParticipant)
                .WithMany(m => m.SecondEvents)
                .HasForeignKey(m => m.SecondParticipantID);  
    modelBuilder.Entity<Event>()
                .HasRequired(m => m.CreatedBy)
                .WithMany()
                .HasForeignKey(m => m.CreatedByID);
    modelBuilder.Entity<Participant>()
                .HasRequired(m => m.CreatedBy)
                .WithMany()
                .HasForeignKey(m => m.CreatedByID);  
}
相关问题