2013-05-20 50 views
2

我首先使用实体​​框架代码。我有2个实体(用户和配置文件),它们之间的关系是一对多的,即一个用户只能有一个配置文件,但一个配置文件可以分配给多个用户。下面的实体:带有一对多关系的EF 4.1代码首先创建重复的外键

[Table("Users")] 
public class User 
{ 
    [Key(), Required] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    [Required] 
    public virtual string Name { get; set; } 

    [Required] 
    [ForeignKey("Profile")] 
    public virtual int ProfileId { get; set; } 
    public virtual Profile Profile { get; set; } 

    public virtual ICollection<AnotherEntityB> anotherEntityB { get; set; } 
} 

[Table("Profiles")] 
public class Profile 
{ 
    [Key(), Required] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    [Required] 
    public virtual string Name { get; set; } 

    // Below the user that performs the discharge of the profile. Only 1 user can do it. 
    [ForeignKey("User")] 
    public virtual int? UserId { get; set; } 
    public virtual User User { get; set; } 

    public virtual DateTime? dischargeDate { get; set; } <-- this is the date that user performs the discharge of the profile 

    public virtual ICollection<User> Users { get; set; } 


    public virtual ICollection<AnotherEntityC> anotherEntityC { get; set; } 
} 

还我已删除的OnModelCreating方法的一些约定:

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 

的问题是,EF英孚教育创造用户实体两个外键:

ProfileId (FK, int, No NULL) 
Profile_Id (FK, int, NULL) 

并且只有一个外键应该位于Users实体中: ProfileId(FK,int,No NULL)

怎么了?

回答

5

因为有导航属性UserProfile引用该User实体EF不能由其中两个的属于逆属性Profile在实体User公约决定Users。您必须EF使用[InverseProperty]属性给出提示:

[InverseProperty("Users")] 
public virtual Profile Profile { get; set; } 

现在,它定义了User.ProfileProfile.Users逆导航属性,并且两者相同的关系结束。如果没有属性EF假定两个导航属性是两个不同关系的结尾,并且其中一个导致属性负责其他外键Profile_Id

Here有点多背景。

+1

它就像一个魅力!非常感谢!该工作原理的另一种方法是通过重写OnModelCreating并把这样的:modelBuilder.Entity () .HasRequired(R => r.Profile) .WithMany(S => s.Users) .HasForeignKey(F => f.ProfileId ) .WillCascadeOnDelete(false); – user1624552

+0

@ user1624552:是的,这是Fluent版本。我以为你正在使用注释,因为你的模型中已经有了一些属性。但是如果你想禁用级联删除,你甚至必须**使用Fluent版本。我的答案中的属性配置将对应于所需关系的默认值,即'WillCascadeOnDelete(true)'。 – Slauma

相关问题