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 5一对多关系-为什么为每种配置文件类型创建外键_Entity Framework_Data Annotations_Code First_One To Many - Fatal编程技术网

Entity framework EF 5一对多关系-为什么为每种配置文件类型创建外键

Entity framework EF 5一对多关系-为什么为每种配置文件类型创建外键,entity-framework,data-annotations,code-first,one-to-many,Entity Framework,Data Annotations,Code First,One To Many,我已设置以下模型: public class User { [Key] [Required] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int Id { get; set; } [Required] [StringLength(50)] public string UserName { get; set; } [Requir

我已设置以下模型:

    public class User
{
    [Key]
    [Required]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    [StringLength(50)]
    public string UserName { get; set; }

    [Required]
    public TypeOfProfile ProfileType { get; set; }

    [StringLength(50)]
    public string ProfileName { get; set; }
我不想使用TPT。我希望用户表成为快速加载的简短摘要表。单击用户后,将获取其配置文件。我有多种类型的个人资料。例如

public class Person | Business | Artist
{
    [Key]
    [Required]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.None)]
    public int UserId { get; set; }

    [Required]
    [StringLength(50)]
    public string Name { get; set; }

    [Required]
    public int AddressId { get; set; }

    [ForeignKey("UserId")]
    public virtual User User { get; set; }

    public virtual Address Address { get; set; }

    public virtual IList<Deal> Deals { get; set; }

    public virtual IList<Event> Events { get; set; }

    public virtual IList<Vacancy> Vacancies { get; set; }
除了一件事之外,所有的东西都是先用代码创建的。在事件、交易和空缺表中,在事件、交易和空缺的UserId属性的顶部为每种类型创建一个外键

因此,该模型坚持为用户提供每种类型的配置文件,而我只希望每个用户拥有一种类型的配置文件:

专栏:

Id(主键,整数,非空)

UserId(FK,int,非null)

关键点:

PK_dbo.Events

FK_dbo.Events.dbo.Artists_用户ID

FK_dbo.Events.dbo.Businesses_用户ID

FK_dbo.Events.dbo.People_UserId

FK_dbo.Events.dbo.Users_UserId

我只希望创建用户Id的外键。当我删除其他fk的人,企业和艺术家,然后一切都是工作,因为我想它。像这样:

专栏:

Id(主键,整数,非空)

UserId(FK,int,非null)

关键点:

PK_dbo.Events

FK_dbo.Events.dbo.Users_UserId

但是,我如何首先配置代码,或者通过fluent-API配置代码,使3个额外的外键不会被创建。(由于这些概要文件的ILists)我不希望能够从事件对象检索概要文件,只从用户对象检索概要文件

提前谢谢


Kr

我使用TPH架构解决了我的问题。(每个层次结构的表)现在我只有一个配置文件表,其中包含个人、企业和艺术家的鉴别器。我的配置文件表的主键同时也是我的用户表的外键


Kr

不清楚
艺术家
商业
在该模型中的位置。它们是从
派生的吗?在我看来,
用户
应该拥有这些收藏,但这可能违背了它的目的。艺术家和企业是人与人的兄弟。模型中没有继承。我已经编辑了上面的代码。我不理解模型。什么是实体类
TypeOfProfile
,它与
Person
Business
Artist
?TypeOfProfile是一个枚举,仅用于指示加载用户配置文件时必须寻址的控制器。我不希望用户和他的个人资料(商业、个人、艺术家)之间有直接的联系,因为个人资料将是一个更繁重的阅读操作。(我还想避免对用户使用延迟加载)因此,当我有我的用户时,我会检查他有什么类型的配置文件,然后我会从正确的控制器加载他的配置文件:BusinessController、ArtistController、PersonController。
public class Event
{
    [Key]
    [Required]
    [Column(Order = 0)]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    [Column(Order = 1)]
    public int UserId { get; set; }

    [Required]
    public int AddressId { get; set; }

    ...

    public virtual User User { get; set; }

    public virtual Address Address { get; set; }