EF4:保存对象子项

时间:2011-05-24 18:46:52

标签: entity-framework-4 wcf-data-services

在数据库中我有这些表:Product,Request和RequestProducts。 RequestProducts是一个将许多产品链接到一个请求的表。

这是我的代码:

        Product newProduct = new Product
                                 {
                                     Unity_ID = 3,
                                     Quantity = 2,
                                     Name = "toto",
                                     AlreadyCurrency = true
                                 };

        Request newRequest = new Request
                                 {
                                     User_ID = 1,
                                     CaseNumber = 1,
                                     Draft = false
                                 };

        newRequest.Products.Add(newProduct);

        _db.AddToProducts(newProduct);
        _db.AddToRequests(newRequest);
        _db.SaveChanges();

执行后,在我的数据库中,我得到1个产品和1个请求。没关系,但是使用行newRequest.Products.Add(newProduct);创建的链接不会创建表RequestProducts,而EF4通过在Request对象中提出Products列表来理解链接。

是否可以仅使用此代码创建此链接?

谢谢!

2 个答案:

答案 0 :(得分:0)

对于一对多关系,您不需要额外的表格。对于多对多关系,您只需要额外的表格。

所以,如果不知道你正在做什么以及为什么会有更多具体细节,我会说它运作正常。

理想情况下,您的Request对象看起来像:

public class Request
{
    public int RequestId {get; set;}
    //Other defining params here

    public ICollection<Product> Products {get; set;}
}

然后你的Product对象看起来像:

public class Product
{
    public int ProductId {get; set;}
    //other defining params
    public int RequestId {get; set;} //your FK

    public virtual Request Request {get; set;} //If you ever need the Product to be aware of the Request to which it is attached.
}

答案 1 :(得分:0)

假设您使用EDMX的生成实体,您的RequestId表中应该只有一个Product FK列。

然后在从DB生成EDMX后,将不会有其他表,因此您应该能够这样做:

Request newRequest = new Request
                         {
                             User_ID = 1,
                             CaseNumber = 1,
                             Draft = false
                         };

Product newProduct = new Product
                         {
                             Unity_ID = 3,
                             Quantity = 2,
                             Name = "toto",
                             AlreadyCurrency = true,
                             Request = newRequest
                         };


//Redundant
//newRequest.Products.Add(newProduct);

_db.AddToProducts(newProduct);

//Redundant
_db.AddToRequests(newRequest);

_db.SaveChanges();

//Never forget - or wrap in a using statement
_db.Dispose()

更新

  1. 上面的案例是one2many(一个请求有很多产品)
  2. 因为我将Request(现在是Product的属性)设置为newRequest,然后将其添加到上下文(或者如果已添加) ),整个图形的所有相关实体也将自动添加。
  3. 仔细阅读this