首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从实体框架中的明细部分获取主明细关系的主部分中的字段的值

如何从实体框架中的明细部分获取主明细关系的主部分中的字段的值
EN

Stack Overflow用户
提问于 2013-01-09 21:22:04
回答 1查看 197关注 0票数 0

我在我的实体模型中有一个主细节关系(为了让它更容易想到经典的Northwind Orders-OrderDetails),最终用户将在网格中输入主部件的细节,然后向下移动到较低的网格以输入“相关”细节。

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

在实体模型本身中有没有一种简单的方法来做到这一点。我会用vb来做这件事,但我能读懂C#。

需要澄清的其他信息:

Jeric在他的回答中提出了一个有趣的观点,我对此表示感谢,这表明这个表可能没有被适当地正常化。在任何正常情况下,我都会同意,但在这里,我被迫受到我无法控制的限制。Tis是用于记录商业渔民上岸鱼类的应用程序。每次登陆可能包含几种不同的鱼类,根据法律,所有登陆细节都必须报告给政府机构,政府机构再将信息传递给科学家,科学家利用这些信息计算鱼类数量,从而限制捕获量。

为此,捕获鱼的确切位置很重要,因此每一条线细节(落地细节线)都必须记录捕获该项目的区域和区域。对于大多数小船来说,这些信息几乎总是相同的(但出海数月的大船可以在几个区域和区域捕鱼(因此需要))。

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

因为我使用entity Framework来做这件事,所以我还不知道登陆的最终ID是什么(它还没有被提交,entity框架的美妙之处在于它使得这种数据输入很容易),所以我试图从尚未为其创建“官方”id的登陆标头中获取容器id。

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

我正在尝试做的是,在登录详细信息实体的某个On PropertyChanging事件中找到一种方法,以检索其关联的登录标头实体的vesselId,该实体尚未提交到数据库中。它在客户端缓存中,但还没有在数据库中。

非常感谢

EN

回答 1

Stack Overflow用户

发布于 2013-01-10 14:23:22

如果我没弄错您的问题,您是说在OrderDetail实体中有一些属性是基于Customer实体填充的。我觉得这很奇怪,因为您应该能够通过遍历从OrderDetail到Order再到Customer的链接来查询来自OrderDetail实体的任何客户详细信息。您应该不需要在OrderDetail表下持久化客户属性(例如,性别)。您可能需要考虑尝试更好地规范化您的模式。

在任何情况下,假设您有以下实体:

代码语言:javascript
复制
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实例时,您应该知道它链接到哪个订单,但不一定是本例中可以看到的客户:

代码语言:javascript
复制
var orderDetail = new OrderDetail {OrderId = 1};

在insert方法中,您希望确保在插入之前获取客户详细信息并填充orderDetail中的相关字段。由于您知道OrderId,因此可以使用LINQ查询相关的客户详细信息。在本例中,我们希望获取Customer.Gender并将其分配给OrderDetail.CustomerGender。您可能可以在一条语句中写出这一点,但为了更容易阅读,我将对其进行分解。

代码语言:javascript
复制
//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();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14236163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档