实体框架和表关系

时间:2014-02-24 08:22:43

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

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

我的数据库看起来像这样 Database

我尝试通过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

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

  

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

我怀疑。我会说ID Likely是一个正在计算的标识列。

通常情况下,非常糟糕的样式会在客户端手动分配ID。当2个人同时插入时你会怎么做?

EF可以处理服务器端标识列。不,这些数字不是随机的 - 如果你看一下这些数字就不会产生。

答案 2 :(得分:0)

如果您希望每个订单有多种类型,那么您的数据库设计可能有误。我会在表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)
     )

通过这种方法,您不会遇到任何问题。

e.g。 这很好用

         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),反之亦然(多对多关系)

我希望这就是你想要的

答案 3 :(得分:0)

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