【问题标题】:Entity Framework: Saving a record with FK values and NOT looking up relationships实体框架:使用 FK 值保存记录而不查找关系
【发布时间】:2009-05-05 16:49:56
【问题描述】:

我有一个“Expenses”表,其中包含一个“ExpenseType”表的 FK 值。现在,如果我想保存新的费用,我首先获取 FK 的 int 值,查找 ExpenseType 表,并将对象分配给费用对象。例如:

//create new expense
var e = new Expense();

//lookup the associated expense type
var et = context.ExpenseTypeSet.First(e -> e.expenseTypeID == 10);

//set field values
e.expenseName = "Some name";
e.expenseType = et;

//save
context.Save();

有没有一种方法可以创建/插入一条记录,而无需首先对 FK 表进行查找?不需要查找并强制进行额外的数据库命中。我已经知道 FK ID...那么有没有办法只设置 ID 并让它快乐?

提前致谢 -

【问题讨论】:

    标签: c# asp.net entity-framework


    【解决方案1】:

    您也可以使用 EntityReference 来做到这一点:

    e.expenseTypeReference.EntityKey 
       = new EntityKey("MyContainer.expenseTypeSet", "expenseTypeID", 10);
    

    我有一个 tips series 涵盖了这个问题和相关问题:

    您可能特别想看看这个Tip 7,它讨论了为 FK 创建假属性。除非您愿意,否则您无需走那么远,但这些原则很有用。

    【讨论】:

    • 这样不是违背实体框架的概念吗?我自己之前遇到过这种情况,但是通过直接设置某些东西的 ID 会破坏数据库值的对象表示。这就像将两者混合在一起。我想没有法律禁止它,但似乎这个想法已经丢失了。更多的是一个愚蠢的哲学问题。
    • 天哪,这是花生酱以来最好的东西!好的,所以问题 - MyContainer 指的是什么?
    • @Programming Tool - 我遇到了喜欢这两种方式的人。有些人,像你一样,认为这违反了各种规则;其他人认为必须为每个 FK 进行数据库查找只是为了进行插入是一种罪恶。在我的情况下,如果我要提供一个不存在的 ID,则 db 不会因为它内置的限制而允许它。
    • 楚你可以通过调用ctx.DefaultContainerName得到真正的“MyContainer”
    • 有优势的地方,应该应用OO原则。但是在处理关系系统时,一些 OO 原则将变得完全愚蠢......让 DB 选择只是为了设置 FK 值是应用愚蠢的 OO 原则的典型例子,它没有实际意义或提供任何实际优势。关系世界和对象世界之间总会存在阻抗不匹配。在边界附近,您必须开始违反原则才能找到中间立场。整个 Entity Key 是一个工具,可以让你恢复这种问题案例的常识。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 2014-10-13
    相关资源
    最近更新 更多