Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework EF 4.1具有一对多关系的代码优先创建重复的外键_Entity Framework_Code First - Fatal编程技术网

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; }