我设置了以下模型:
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; }
通过这种方式,我可以为某个用户创建配置文件,并为其提供与用户 ID 相同的 ID,因此是 DatabaseGeneratedOption.None。这一切都很好。但随后集合就位:交易,活动,空缺,..
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; }
除了一件事之外,使用 Code First 可以很好地创建所有内容。在 Events、Deals 和 Vacancy 表中,在 Event、Deal 和 Vacancy 的 UserId 属性之上为每种类型创建了一个外键。
因此,该模型坚持为用户提供每种类型的个人资料,而我只希望每个用户拥有一种类型的个人资料:
柱子:
Id (PK, int, not null)
UserId (FK, int, not null)
键:
PK_dbo.Events
FK_dbo.Events.dbo.Artists_UserId
FK_dbo.Events.dbo.Businesses_UserId
FK_dbo.Events.dbo.People_UserId
FK_dbo.Events.dbo.Users_UserId
...
我只希望创建 Users_Id 的外键。当我删除其他人、企业和艺术家的 fk 时,一切都按我的意愿工作。像这样:
柱子:
Id (PK, int, not null)
UserId (FK, int, not null)
键:
PK_dbo.Events
FK_dbo.Events.dbo.Users_UserId
...
但是我怎样才能首先配置代码或通过流利的 API 来配置没有创建 3 个额外外键的代码。(由于这些配置文件的 ILists)我不希望能够从事件对象中检索配置文件,只有用户对象。
提前致谢!
氪