我正在尝试首先创建与实体框架代码中具有相同类型关系的公司的数据模型。我想单向创建关系,因此当一个公司将另一个添加为客户时,另一个公司不会自动将该公司作为供应商。
public class Company {
[Key]
public string Id { set; get; }
public string Name { set; get; }
public virtual ICollection<Company> Customers { set; get; }
public virtual ICollection<Company> Suppliers { set; get; }
}
当我这样更新数据库时,最终得到一个名为“ CompanyCompanies”的连接表。
公司公司
| Company_Id | Company_Id1 |
|------------|-------------|
| 1234 | 1234 |
我想创建两个表来连接这些值,如下所示:
公司客户
| Company_Id | Customer_Id |
|------------|-------------|
| 1234 | 1234 |
公司供应商
| Company_Id | Supplier_Id |
|------------|-------------|
| 1234 | 1234 |
我对流利的api进行了很多研究,并尝试在其中定义关系,但是似乎无法理解如何做到这一点。我发现了很多使用不同实体的示例,但只有this answer与自身有关系。但是,当我从该问题实施解决方案并更新数据库时,出现错误,提示连接超时。
modelBuilder.Entity<Company>()
.HasMany(c => c.Customers)
.WithMany()
.Map(m =>
{
m.ToTable("CompanyCustomer");
m.MapLeftKey("CompanyId");
m.MapRightKey("CustomerId");
});
错误号:-2,状态:0,类:11
执行超时已过期。
在操作完成之前超时或服务器没有响应。
当我同时使用CompanyCustomer和CompanySupplier时,出现另一个错误
参数@objname不明确,或者声明的@objtype(COLUMN)错误。
我还尝试为该关系创建一个新对象,并让Company对象保存一个CompanyCustomers列表,但是当我以此更新数据库时,我得到了一个包含三列的连接表。
public class CompanyCustomer
{
[Key, Column(Order = 0)]
[ForeignKey("Company")]
public string CompanyId { set; get; }
[Key, Column(Order = 1)]
[ForeignKey("Customer")]
public string CustomerId { set; get; }
public virtual Company Company { set; get; }
public virtual Company Customer { set; get; }
}
公司客户
| CompanyId | CustomerID | Company_Id |
|-----------|------------|------------|
| 1234 | 1234 | 1234 |
我不明白如何在同一个实体之间建立几种关系类型。我可以借助流利的api来做到这一点,还是必须重新设计模型?
最佳答案
流利的配置
modelBuilder.Entity<Company>()
.HasMany(c => c.Customers)
.WithMany()
.Map(m =>
{
m.ToTable("CompanyCustomer");
m.MapLeftKey("CompanyId");
m.MapRightKey("CustomerId");
});
确实是配置第一个关系的正确方法。第二步,您需要执行类似的操作:
modelBuilder.Entity<Company>()
.HasMany(c => c.Suppliers)
.WithMany()
.Map(m =>
{
m.ToTable("CompanySupplier");
m.MapLeftKey("CompanyId");
m.MapRightKey("SupplierId");
});
在我干净的EF测试环境中(如果需要的话,最新的EF6.1.3)会产生以下迁移:
CreateTable(
"dbo.Company",
c => new
{
Id = c.String(nullable: false, maxLength: 128),
Name = c.String(),
})
.PrimaryKey(t => t.Id);
CreateTable(
"dbo.CompanyCustomer",
c => new
{
CompanyId = c.String(nullable: false, maxLength: 128),
CustomerId = c.String(nullable: false, maxLength: 128),
})
.PrimaryKey(t => new { t.CompanyId, t.CustomerId })
.ForeignKey("dbo.Company", t => t.CompanyId)
.ForeignKey("dbo.Company", t => t.CustomerId)
.Index(t => t.CompanyId)
.Index(t => t.CustomerId);
CreateTable(
"dbo.CompanySupplier",
c => new
{
CompanyId = c.String(nullable: false, maxLength: 128),
SupplierId = c.String(nullable: false, maxLength: 128),
})
.PrimaryKey(t => new { t.CompanyId, t.SupplierId })
.ForeignKey("dbo.Company", t => t.CompanyId)
.ForeignKey("dbo.Company", t => t.SupplierId)
.Index(t => t.CompanyId)
.Index(t => t.SupplierId);
这正是您想要的。
关于您所获得的异常,它们可能与您对数据库的实验有关。确保从干净的数据库开始或删除
Company
实体(如果存在,则删除CompanyCustomer
),相应的
DbSet
和流畅的配置,请更新数据库以清除以前的混乱,然后重试。关于c# - Entity Framework 中同一类的多个列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42658302/