【问题标题】:Entity Framework and Table Relationships实体框架和表关系
【发布时间】:2014-03-25 19:08:35
【问题描述】:

我正在使用 VS 2013 和 EF6 构建 MVC 应用程序,但无法理解我看到的行为。

我的数据库是这样的

我尝试通过 EF 生成的模型添加新订单:

ResourceType resource = new ResourceType();
resource.ID = 2;
resource.Name = "Van"
order.resourceType().Add(resource)

db.Orders.Add(order);
db.SaveChanges();

一切正常,但在数据库中,我看到正在使用随机 ID 创建新的 ResourceType 记录。

我期望 ResourceType 只是 ResourceType_Order 时使用的参考/查找表,转换为资源类型名称。

对于每个订单,有多种资源类型(例如,每个订单需要多辆货车)。

我的数据库设计错了吗?

更新

我尝试以更好的方式提出这个问题here

【问题讨论】:

  • 忘了提一下,EF 没有为Resource_Type_Order 表创建类。但是当我添加一个新订单时,它会正确填充,但它使用从新 ResourceType 条目中随机创建的 ID。

标签: c# sql sql-server entity-framework model-view-controller


【解决方案1】:

EF 代码的默认行为首先是通过身份填充基于整数的主键 - 检查 PK 列是否使用数据库中的身份

【讨论】:

  • 仍在学习 sqlserver,但如果 identity 是指 AUTO_INCREMENT,那么 ID 是 identity
  • 是的,那么你在添加新记录时指定的ID将在数据库插入记录时由于身份被覆盖
【解决方案2】:

我看到正在使用随机 ID 创建新的 ResourceType 记录。

我怀疑。我会说 ID Likely 是一个正在计数的身份列。

通常在客户端手动分配 ID 是非常糟糕的风格。当 2 个人同时插入时,你会怎么做?

EF 可以处理服务器端标识列。不,这些数字不是随机的 - 如果您按生成顺序查看多个数字,则不会。

【讨论】:

  • 你说得对,它们不是随机的,只是向上计数。我不想从客户端分配 ID。 ResourceType 表中的 ID 大多是静态的。示例 ID=1,货车 ID=2,卡车,ID=3,汽车。我不指望那些会改变。订单 ID 是自动分配的,我希望 ResourceType_Order 条目应该指向一个订单 ID 并具有一个或多个 ResourceTypes
  • 那么基本上你必须更改数据库中的设置,EF - EF 现在认为它们是在服务器上分配的,服务器表也这样认为;)从正确的表定义开始。该字段不应该是一个身份 - EF 不应该认为它是一个身份。然后你可以手动分配它们。
  • 我一定是做错了什么。我从 ResourceType 表的 ID 列中删除了identity。现在,当我尝试插入时,我收到{"Violation of PRIMARY KEY constraint 'PK_Resource_Type'. Cannot insert duplicate key in object 'dbo.Resource_Type'. The duplicate key value is (2).\r\nThe statement has been terminated."} 的 SQL 错误。
【解决方案3】:

如果您希望每个订单有多种类型,您的数据库设计可能是错误的。我会像 Resource_TypeOrder 表中的复合键一样使用 OrderID 和 TypeID。 像这样的:

     CREATE TABLE Resource_TypeOrder
     (
     OrderID int FOREIGN KEY(OrderID) REFERENCES Orders(OrderID) NOT NULL,
     TypeID int FOREIGN KEY(TypeID) REFERENCES Resource_Type(TypeID) NOT NULL,
     PRIMARY KEY(OrderID, TypeID)
     )

使用这种方法,您不会遇到任何问题。

例如 这很好用

         var ctx = new TypesEntities();


        Resource_Type type = new Resource_Type();
        type.Name = "Type1";

        ctx.Resource_Type.Add(type);

        Order order = new Order();
        order.Name = "Order1";

        ctx.Orders.Add(order);
        type.Orders.Add(order);

        Order order2 = new Order();
        order2.Name = "Order2";

        ctx.Orders.Add(order2);
        type.Orders.Add(order2);


        ctx.SaveChanges();

此代码为您提供 1 种类型(即 ID=1)和 2 个订单(即 OrderID=1、OrderID=2),但反之亦然(多对多关系)

我希望这是你想要的

【讨论】:

    【解决方案4】:

    您说“对于每个订单,有多种资源类型”,但在您的模型中,在 ResourceType_order 表中,orderId 列是 Pk,它不是 pk

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多