Entity framework EF 4.1具有一对多关系的代码优先创建重复的外键
我首先使用实体框架代码。我有两个实体(用户和配置文件),它们之间的关系是一对多的,也就是说,一个用户只能有一个配置文件,但一个配置文件可以分配给多个用户。以下实体:Entity framework EF 4.1具有一对多关系的代码优先创建重复的外键,entity-framework,code-first,Entity Framework,Code First,我首先使用实体框架代码。我有两个实体(用户和配置文件),它们之间的关系是一对多的,也就是说,一个用户只能有一个配置文件,但一个配置文件可以分配给多个用户。以下实体: [Table("Users")] public class User { [Key(), Required] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } [Required]
[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; }
}
并且用户实体中只能有一个外键:
ProfileId(FK,int,无空)
怎么了?因为在Profile
中有两个导航属性User
和Users
,它们引用了用户
实体EF,但EF不能按照约定决定这两个属性中的哪一个属于实体用户
中的反向属性Profile
。您必须使用[InverseProperty]
属性给出提示:
[InverseProperty("Users")]
public virtual Profile Profile { get; set; }
现在,它定义了User.Profile
是Profile.Users
的反向导航属性,并且两者都是相同关系的端点。如果没有属性EF,则假定两个导航属性是两个不同关系的端点,其中一个负责附加外键Profile\u Id
有点背景。它就像一个符咒!非常感谢!另一种有效的方法是重写模型创建并放置:modelBuilder.Entity().HasRequired(r=>r.Profile)。WithMany(s=>s.Users)。HasForeignKey(f=>f.ProfileId)。WillCascadeOnDelete(false)@用户1624552:是的,这是流畅的版本。我认为您正在使用注释,因为您的模型中已经有了一些属性。但是如果你想禁用级联删除,你甚至必须使用Fluent版本。我的答案中的属性配置将对应于所需关系的默认值,即
WillCascadeOnDelete(true)
。
ProfileId (FK, int, No NULL)
Profile_Id (FK, int, NULL)
[InverseProperty("Users")]
public virtual Profile Profile { get; set; }