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