实体框架中同一类的多个列表

克里斯托弗·贝尔格

我试图首先创建与实体框架代码中具有相同类型关系的公司的数据模型。我想单向创建关系,因此当一家公司将另一家添加为客户时,另一家公司不会自动将该公司作为供应商。

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进行了很多研究,并尝试在其中定义关系,但是似乎无法理解如何执行此操作。我发现了很多使用不同实体的示例,但只有这个答案与自身有关。但是,当我从该问题实施解决方案并更新数据库时,出现一条错误消息,指出连接超时。

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如果存在),相应的DbSets和流畅的配置,请更新数据库以清理先前的混乱并重试。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

实体框架代码类的第一个属性和同一类的列表

来自分类Dev

同一类中的多个常量

来自分类Dev

获取同一类的多个下拉列表的选定索引

来自分类Dev

在钩子中调用同一类中的多个函数

来自分类Dev

NLog同一类中的多个记录器

来自分类Java

使用ByteBuddy在同一类中检测多个方法

来自分类Dev

在C ++中对同一类使用多个模板

来自分类Dev

同一类中的多个Operator()重载

来自分类Dev

从同一类的下拉列表jQuery中获取值

来自分类Dev

在实体框架中为多个目的映射同一模型类

来自分类Dev

在实体框架中,如何处理同一个类的多个外键

来自分类Dev

实体框架表拆分:不在同一类型层次结构中/没有有效的一对一外键关系

来自分类Dev

声明同一类的多个对象?

来自分类Dev

同一类的多个元素

来自分类Dev

无法确定类型之间关联的主要终点-实体框架错误,同一类之间的类关系

来自分类Dev

调用同一类中的方法

来自分类Java

同一类型实体的多对多关系

来自分类Dev

如何使用Java中的动态类加载来加载同一类的多个版本

来自分类Dev

删除列表中的项目反映同一类的其他列表。为什么?

来自分类Dev

XACML 3.0中同一类别中的多个属性

来自分类Dev

将同一类javascript中的多个数字相加

来自分类Java

Java-数字游戏-同一类中的多个ActionListener

来自分类Dev

如何在不同线程中对同一类的多个对象进行方法调用?

来自分类Java

log4j.properties文件-同一类中的多个记录器

来自分类Dev

共享同一类的 href 中的多个替换字符串

来自分类Dev

我可以使用 getparcelableextra 在同一类中获得多个意图吗

来自分类Dev

我如何在 TestNG 中运行来自同一类的多个测试用例

来自分类Dev

在Interface Builder中实例化同一类的多个对象会导致共享属性

来自分类Dev

当同一类中的两个或多个方法使用相同的名称时

Related 相关文章

  1. 1

    实体框架代码类的第一个属性和同一类的列表

  2. 2

    同一类中的多个常量

  3. 3

    获取同一类的多个下拉列表的选定索引

  4. 4

    在钩子中调用同一类中的多个函数

  5. 5

    NLog同一类中的多个记录器

  6. 6

    使用ByteBuddy在同一类中检测多个方法

  7. 7

    在C ++中对同一类使用多个模板

  8. 8

    同一类中的多个Operator()重载

  9. 9

    从同一类的下拉列表jQuery中获取值

  10. 10

    在实体框架中为多个目的映射同一模型类

  11. 11

    在实体框架中,如何处理同一个类的多个外键

  12. 12

    实体框架表拆分:不在同一类型层次结构中/没有有效的一对一外键关系

  13. 13

    声明同一类的多个对象?

  14. 14

    同一类的多个元素

  15. 15

    无法确定类型之间关联的主要终点-实体框架错误,同一类之间的类关系

  16. 16

    调用同一类中的方法

  17. 17

    同一类型实体的多对多关系

  18. 18

    如何使用Java中的动态类加载来加载同一类的多个版本

  19. 19

    删除列表中的项目反映同一类的其他列表。为什么?

  20. 20

    XACML 3.0中同一类别中的多个属性

  21. 21

    将同一类javascript中的多个数字相加

  22. 22

    Java-数字游戏-同一类中的多个ActionListener

  23. 23

    如何在不同线程中对同一类的多个对象进行方法调用?

  24. 24

    log4j.properties文件-同一类中的多个记录器

  25. 25

    共享同一类的 href 中的多个替换字符串

  26. 26

    我可以使用 getparcelableextra 在同一类中获得多个意图吗

  27. 27

    我如何在 TestNG 中运行来自同一类的多个测试用例

  28. 28

    在Interface Builder中实例化同一类的多个对象会导致共享属性

  29. 29

    当同一类中的两个或多个方法使用相同的名称时

热门标签

归档