我正在使用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。
答案 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