如何解决实体框架代码优先关系 - 如何定义两个对象之间的关系:两个实体之间的可选一对一
我有一个要求,我需要链接数据库中的 2 个实体(使用代码第一代),但我有点不确定如何定义外键/关系,以便我可以从另一个项目访问每个项目。
>基本上,一个 Job 可以在没有任何票证的情况下存在。工单也可以在没有作业的情况下存在,但最终将为现有工单创建作业。
我使用的是实体框架 6
public class Job
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid JobId { get; set; }
//Other Properties
public virtual Ticket Ticket { get; set; }
}
public class Ticket
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid TicketId { get; set; }
//Other Properties
public virtual Job Job { get; set; }
}
然后,基本上我想要做的是选择一个带有工单的作业(如果有的话)和带有作业的工单(如果有的话)。
即
var tickets = context.Tickets
.Include(ticket => ticket.Job);
和
var job = context.Jobs
.Include(job => job.Ticket);
我是否在两个表上都放置了一个可为空的外键?
public class Job
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid JobId { get; set; }
//Other Properties
public Guid? TicketId { get; set; )
[ForeignKey("TicketId")]
public virtual Ticket Ticket { get; set; }
}
public class Ticket
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid TicketId { get; set; }
//Other Properties
public Guid? JobId { get; set; )
[ForeignKey("JobId ")]
public virtual Job Job { get; set; }
}
...或者有没有更好的方法来做到这一点(最好使用数据注释)?
预先感谢您提供的任何指导。
编辑:以下内容似乎有效,但当然不能保证 TicketId 的 Job 和 JobId 的 TicketId 的唯一键: - 更正:这不适用于检索外键属性 - 见下文
public class Job
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid JobId { get; set; }
//Other Properties
[InverseProperty("Jobs")]
public Guid? TicketId { get; set; )
[ForeignKey("TicketId")]
public virtual ICollection<Ticket> Tickets { get; set; }
}
public class Ticket
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid TicketId { get; set; }
//Other Properties
[InverseProperty("Tickets")]
public Guid? JobId { get; set; )
[ForeignKey("JobId ")]
public virtual ICollection<Job> Jobs { get; set; }
}
编辑:请参阅 .NET Core 的 Serge 回答。我已经尝试了上述方法,但并没有检索每个实体的 Child 属性。 IE。检索作业时没有工单,检索工单时没有作业。
如果有人有任何想法,仍然会卡住!
解决方法
你必须修理你的桌子。如果您希望键自动递增,请将 Guid 更改为 int。还要注意 Nullable TicketId
public class Job
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public int? TicketId {get; set;}
[ForeignKey(nameof(TicketId ))]
[InverseProperty("Job")]
public virtual Ticket Ticket { get; set; }
}
public class Ticket
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
//Other Properties
[InverseProperty("Ticket")]
public virtual Job Job { get; set; }
}
使用此代码在 Vs 2019 和 MS SQL Server 中成功测试此模型
var ticket = new Ticket { Name = "Ticket1" };
_context.Tickets.Add(ticket);
_context.SaveChanges();
var job = new Job { Name = "Job1",TicketId=1};
_context.Jobs.Add(job);
_context.SaveChanges();
var job2 = new Job { Name = "Job2" };
_context.Jobs.Add(job2);
_context.SaveChanges();
var jobs = _context.Jobs.Include(i => i.Ticket).ToList();
var tickets = _context.Tickets.Include(i => i.Job).ToList();
,
public class Job
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid JobId { get; set; }
//Other Properties
[ForeignKey("Ticket")]
public int TicketId { get; set; }
public virtual Ticket Ticket { get; set; }
public virtual List<Job> Jobs { get; set; }
}
public class Ticket
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid TicketId { get; set; }
//Other Properties
[ForeignKey("Job")]
public int JobId { get; set; }
public virtual Job Job { get; set; }
public virtual List<Ticket> Tickets { get; set;}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。