根据关系将核心数据记录添加到实体

时间:2013-11-19 23:35:07

标签: entity-framework core-data xcode4.5

我有两个实体ProductModel和OrderItem。 ProductModel具有关系集prodToOrder,inverse orderToProd和one to Many。 OrderItem与orderToProd的关系设置为逆prodToOrder和多对一。

我添加了ProductModel数据没有问题,但我的问题是在我向OrderItem插入新记录然后返回并获取OrderItem,产品名称为null。如果我同时将两个记录同时插入ProductModel和OrderItem,它将起作用,但我不会同时添加两个实体,我需要选择已有的产品名称并将详细信息添加到OrderItem。

我认为问题在于,除非我同时向两个实体插入记录,否则不会创建关系。

我在下面的函数中执行新的OrderItem:

    - (IBAction)cmdSave:(id)sender {


    //Get max productid
    NSNumber *orderitemid =[self getMaxOrderItemID];
    NSNumber *addValue= [NSNumber numberWithInteger:([orderitemid integerValue] + 1) ];
    NSManagedObjectContext *context = [self managedObjectContext];

    // Create a new managed object
    OrderItem *orderDetails = [NSEntityDescription insertNewObjectForEntityForName:@"OrderItem" inManagedObjectContext:context];
    ProductModel *prod  =[NSEntityDescription insertNewObjectForEntityForName:@"ProductModel" inManagedObjectContext:context];


    orderDetails.order-id=[NSNumber numberWithInteger:[addValue integerValue]];
    orderDetails.product-id =[NSNumber numberWithInteger:[product-id integerValue] ];
    orderDetails.qty = [NSNumber numberWithInteger:[self.txtQty.text integerValue]];
    orderDetails.price =[NSDecimalNumber numberWithDouble:[self.txtPrice.text doubleValue]]; 
    orderDetails.total = [NSDecimalNumber numberWithDouble:[self.txtTotal.text 
       doubleValue]];

   //if i do the following statement it will insert product id to ProductModel entity but i do not want to do that and how do i maintain relationships without inserting in to ProductModel.


***   prod.product-id=[NSNumber numberWithInteger:[product-id integerValue] ];
   orderDetails.orderToProd=prod;
  ***

    NSError *error = nil;
    // Save the object to persistent store
    if (![context save:&error]) {
        NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
    }
   }

我很感谢您的帮助或建议。

2 个答案:

答案 0 :(得分:0)

再次检查您的关系。产品可以有许多OrderItem,但OrderItem应该只有一个Product。所以像Product.orderItems这样的东西是To-Many,而反之则是OrderItem.product是To-One。

然后您应该能够创建所需的产品项目

    ProductModel *prodA  =[NSEntityDescription insertNewObjectForEntityForName:@"ProductModel" inManagedObjectContext:context];
    [prod setValue:@"Product A" forKey:@"name"];
    [prod setValue:[NSNumber numberWithInt:1] forKey:@"productID"];

    ProductModel *prodB  =[NSEntityDescription insertNewObjectForEntityForName:@"ProductModel" inManagedObjectContext:context];
    [prod setValue:@"Product B" forKey:@"name"];
    [prod setValue:[NSNumber numberWithInt:2] forKey:@"productID"];

etc...

现在要创建OrderItem,请执行以下操作:

    OrderItem *orderItem1  =[NSEntityDescription insertNewObjectForEntityForName:@"OrderItem" inManagedObjectContext:context];
    [orderItem1 setValue:prodA forKey:@"product"];
    [orderItem1 setValue:[NSNumber numberWithInt:10] forKey:@"quantity"];

etc...

没有必要使用productID链接OrderItemProductOrderItem.product属性直接指向Product对象。

现在保存更改 - 此时模型将被验证,因此您必须使所有关系正确,否则它将因验证错误而失败。

[context save];

要获取产品的所有OrderItem列表,只需使用prodA.orderItems返回OrderItems的NSSet。

答案 1 :(得分:0)

你还没有掌握对象模型的主要要点。你应该忘记所有的ID。您正在使用外键将实体链接在一起 - 这是错误的方式。存在消除这些ID和外键的关系。你设定了关系,你就完成了。

orderItem.productModel = productModel; 

正如您所看到的,这非常简单直接。您的部分困惑来自旧的数据库 - 思考左连接心态。如果您的具体订单商品属于某个产品型号,则该关系应称为“productModel”,而不是“itemToProd”。尽可能保持简单的英语。

BTW我想指出的其他怪癖很少。分配NSNumber属性并且您已经从整数中获得NSNumber时,这就足够了:

entity.property = number; 

entity.property = [NSNumber numberWithInteger:[number integerValue]];