有没有办法让EF将外键映射到除第二个表的ID以外的其他内容。
例如;
public class Company
{
[Key]
public int id { get; set; }
public string name { get; set; }
public string sys_id { get; set; }
}
public class Ticket
{
[Key]
public int id { get; set; }
public string company_id { get; set; }
public string short_desc { get; set; }
}
上面的表保存从外部源引入的数据(这个位工作正常,并且能够查询数据库),因此我无法控制密钥。我遇到的问题是我需要将Ticket.company_id与Company.sys_id连接,而不是Company.id,以便我可以使用Ticket.company.name或Company.ticket.short_desc等。
有人可以告诉我如何实现这个目标吗?
编辑:我一直在环顾四周,发现InverseProperty属性用于将ForeignKey映射到除了另一个表的id之外的其他内容。
例如;
public class Company
{
[Key]
public int id { get; set; }
public string name { get; set; }
public string sys_id { get; set; }
[InverseProperty("company_id")]
[ForeignKey("sys_id")]
public virtual ICollection<Ticket> Tickets { get; set; }
}
public class Ticket
{
[Key]
public int id { get; set; }
public string company_id { get; set; }
public string short_desc { get; set; }
public virtual Company Company { get; set; }
}
但是我收到错误“属性'company_id'不能配置为导航属性。该属性必须是有效的实体类型,属性应该具有非抽象的getter和setter。对于集合属性,类型必须实现ICollection其中T是有效的实体类型。“当我尝试添加迁移时。
提前致谢, 诺曼
答案 0 :(得分:0)
您可以选择sys_id
作为新密钥,并将id
保留用于其他目的,例如:
public class Company
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int id { get; set; }
public string name { get; set; }
[Key, StringLength(128)]
public string sys_id { get; set; }
}
public class Ticket
{
public int id { get; set; }
public string short_desc { get; set; }
public string company_id { get; set; }
[ForeignKey("company_id"), StringLength(128)]
public virtual Company Company { get; set; }
}
虽然我不推荐这个。