【发布时间】:2019-12-02 09:09:02
【问题描述】:
我有两张表 Clients 和 Jobs。一个客户可以有许多工作。但是,我在 Jobs 上有第二个关系,它也应该指称为 WarrantyCompany 的客户。基本上,保修公司也是客户。好吧,客户/工作关系是主要关系,但我想再次参考客户表以获取保修公司的详细信息。
这是客户表:
using JobsLedger.DATA.Entities.Interfaces;
using JobsLedger.DATA.Interfaces;
using System;
using System.Collections.Generic;
namespace JobsLedger.DATA.Entities
{
#nullable enable
public class Client : IEntityBase, IAuditedEntityBase
{
public Client()
{
Jobs = new List<Job>();
}
public int Id { get; set; }
// One warranty company client to a job.
public int? WarrantyCompanyId { get; set; }
public Job? WarrantyCompany { get; set; }
// One suburb to a client.
public int? SuburbId { get; set; }
public Suburb? Suburb { get; set; }
// If its a warranty company then we simply link it one to one to the brand id.
public Brand? Brand { get; set; }
public virtual ICollection<Job> Jobs { get; set; } = default!;
public virtual ICollection<Job> WarrantyCompanyJobs { get; set; } = default!;
}
#nullable disable
}
我正在使用以下方式引用作业表:
// One warranty company client to a job.
public int? WarrantyCompanyId { get; set; }
public Job? WarrantyCompany { get; set; }
工作表如下:
using JobsLedger.DATA.Entities.Interfaces;
using JobsLedger.DATA.Interfaces;
using System.Collections.Generic;
namespace JobsLedger.DATA.Entities
{
public class Job : IEntityBase, IAuditedEntityBase
{
#nullable enable
public Job()
{
Visits = new List<Visit>();
}
public int Id { get; set; }
public int? WarrantyCompanyId { get; set; }
public Client? WarrantyCompany { get; set; }
public int ClientId { get; set; } = default!;
public Client Client { get; set; } = default!;
}
#nullable disable
}
在此表中,我使用以下方法引用客户端表:
public int? WarrantyCompanyId { get; set; }
public Client? WarrantyCompany { get; set; }
我正在使用 Entity Framework Core Fluent API 来创建关系。
我决定从客户的角度来处理这两种关系:
// Two one to many relationships between client and job.
modelBuilder.Entity<Client>()
.HasMany(t => t.Jobs)
.WithOne(g => g.Client)
.HasForeignKey(g => g.ClientId)
.OnDelete(DeleteBehavior.Restrict);
// Same table but a client can also be a warranty agent.
modelBuilder.Entity<Client>()
.HasMany(a => a.Jobs)
.WithOne(b => b.WarrantyCompany)
.HasForeignKey(b => b.WarrantyCompanyId);
我尝试创建迁移,但出现以下错误:
无法在“Client.Jobs”和 'Job.WarrantyCompany',因为两者之间已经存在关系 'Client.Jobs' 和 'Job.Client'。导航属性只能 参与单一关系。
这是不言而喻的。我还尝试从作业表的角度创建关系:
modelBuilder.Entity<Job>()
.HasOne(a => a.Client)
.WithOne(b => b.WarrantyCompany)
.HasForeignKey<Client>(b => b.WarrantyCompanyId);
我发现当有两个返回同一个客户端表时,我无法将关系可视化。
基本上,简而言之,我有一个客户可以有一对多的工作,但对于每一个工作,我可能有一个可选的保修公司,其中保修公司是客户。客户和工作之间的两种关系。
如何在这两个表之间建立主要关系和次要可选关系,次要保修公司关系是一对一还是一对多?
【问题讨论】:
-
您正在为两种关系映射客户端作业导航属性。你需要一个新的,比如 WarrantedJobs?
-
感谢您的评论。想知道如何做到这一点..
标签: c# entity-framework entity-framework-core