0

我在我的实体模型中有一个主细节关系(为了便于理解经典的 Northwind Orders-OrderDetails)最终用户将在网格中输入主零件的详细信息,然后向下移动到较低的网格以输入'相关'的详细信息。

从实体模型本身中,我希望能够在每次创建与该订单相关的新 OrderDetail 记录并使用它来检索一些需要的特定信息时从 Orders 表中检索等效的“CustomerId”值在每个详细记录中。

在实体模型本身中是否有一种简单的方法可以做到这一点。我将在 vb 中执行此操作,但我几乎可以阅读 C#。

用于澄清的附加信息:

Jeric 在他的回答中提出了一个有趣的观点,我感谢他,这表明该表可能没有正确规范化。在任何正常情况下我都会同意,但在这里我受到了我无法控制的约束。Tis 用于记录商业渔民上岸量的应用程序。每次上岸可能包括几种不同的鱼类,所有上岸细节都必须依法报告给政府机构,政府机构反过来将信息传递给科学家,他们使用这些信息来计算鱼类种群,从而计算捕捞配额限制。

为此,鱼被捕获的确切位置很重要,因此每个线细节(着陆细节线)必须记录捕获物品的区域和区域。对于大多数小船来说,这些信息几乎总是相同的(但出海数月的大型船只可以在多个区域和区域捕鱼(因此有要求))。

为了尝试使应用程序的最终用户更容易做到这一点,我认为在船舶记录(相当于 Northwind 客户)中记录默认区域和区域的详细信息是有意义的。在登陆标题表(Northwind Order)中,我引用了vesselId。因此,在输入着陆详细信息行时,我想参考着陆标题并检索船舶 ID,然后将其用作函数中的参数,以检索与该船舶关联的默认区域和区域。

由于我正在使用实体框架来执行此操作,因此我还不知道登陆的最终 ID 是什么(它尚未提交,实体框架的美妙之处在于它使此类数据输入变得容易) 所以我试图从尚未为其创建“官方”ID 的登陆标题中获取船舶 ID。

我希望这对于在大多数情况下(包括我自己)会促使人们认为这是数据库规范化问题的问题更有意义。

我正在尝试做的是在着陆详细信息实体的 On PropertyChanging 事件之一中找到一种方法来检索其关联的着陆标头实体的vesselId,该实体仍将提交到数据库。它在客户端缓存中,但尚未在数据库中。

非常感谢

4

1 回答 1

0

如果我的问题是正确的,那么您的意思是您的 OrderDetail 实体中有一些属性是根据您的 Customer 实体填充的。我觉得这很奇怪,因为您应该能够通过遍历从 OrderDetail 到 Order 到 Customer 的链接从 OrderDetail 实体查询任何客户详细信息。您不需要在 OrderDetail 表下保留 Customer 属性(例如 Gender)。您可能需要考虑尝试更好地规范您的架构。

无论如何,假设您有以下实体:

public class Customer {
    [Key]
    public int Id {get; set;}
    public string Name {get; set;}
    public string Gender {get; set;}
    public virtual ICollection<Order> Orders {get; set;} //<-- I'm also assuming you have a 1 Customer to Many Order relationship
}


public class Order {
    [Key]
    public int Id {get; set;}
    [Required]
    public int CustomerId {get; set;}
    public virtual Customer Customer {get; set;} //<-- assumes a Customer Entity also exists
    public virtual ICollection<OrderDetail> OrderDetails {get; set;} //<-- I'm also assuming you have a 1 Order to Many Order Detail relationship
}

public class OrderDetail {
     [Key]
     public int Id {get;set;}
     [Required]
     public int OrderId {get; set;} //<-- each Order Detail *must* be linked to an order
     public virtual Order Order {get; set;}
     public string CustomerGender {get; set;} //<-- property that gets populated based on the customer that is related to the parent Order of this detail
     //other properties
 }

当您构建 OrderDetail 实例时,您应该知道它链接到的订单,但不一定知道 Customer,如本例所示:

var orderDetail = new OrderDetail {OrderId = 1};

在您的插入方法中,您要确保在插入之前获得客户详细信息并填充 orderDetail 中的相关字段。由于您知道 OrderId,因此您可以使用 LINQ 查询相关的客户详细信息。在此示例中,我们想要获取 Customer.Gender 并将其分配给 OrderDetail.CustomerGender。您可能可以将其写在一个语句中,但为了便于阅读,我将其分解。

//step 1, get the Customer object based on the OrderId
var cust = context.Set<Order>().Include(o => o.Customer)
                  .Where(o => o.Id == orderDetail.OrderId)
                  .Select(o => o.Customer).SingleOrDefault();

//step 2, assign the Customer object property to the OrderDetail instance
orderDetail.CustomerGender = customer.Gender;

//step 3, persist the orderDetail entity
context.Set<OrderDetail>().Add(orderDetail);
context.SaveChanges();
于 2013-01-10T06:23:22.120 回答