什么.NET数据模型可以让我忘记ID?

时间:2012-05-03 16:29:25

标签: c# database linq entity-framework abstraction

我想利用.NET的数据框架,但我对它们的工作原理有点困惑,我不确定我想要的是不可能的。 (我已经用PHP框架做了很多这样的事情,所以我希望.NET可以做同样的事情!)简而言之,我希望我的业务逻辑与数据库无关,并且在某种意义上,我不知道这个事实是它根本就是一个数据库。

这样的疑惑激怒了我:

var productNames =
    from p in context.Products
    where seller.SellerID == mySeller.SellerID
    select p.Name;

相反,我想做:

var productNames =
    from p in context.Products
    where seller == mySeller
    select p.Name;

从本质上讲,我希望我的业务逻辑不要关心关于ID映射。部分地,这是因为在几个表中,ID具有实际意义。 (我正在使用的一些表是从另一个应用程序域导入的,我需要能够直接使用这些ID,但对于我自己的类型,这些ID是偶然的。)

这是示例中的一个小问题,但总的来说,我希望能够完全在对象世界中工作,或多或少地忘记底层数据库的现实。这只是为我的类定义等价运算符的问题吗?

总结:什么.NET数据框架为我提供了对象世界最干净的数据库抽象?

2 个答案:

答案 0 :(得分:5)

如果产品和卖家之间存在关系(我不知道代码示例中的卖家是什么),那么EF让你做p.Seller(或者如果每个产品可以有多个卖家,则为p.Sellers)。 / p>

但这似乎没有帮助你想做什么。 seller == mySeller一点也不清楚。什么决定平等?通常,您有一个主键来建立相等性。所以比较ID仍然有意义。此外,它通常也更有效率。

另一种选择是重载==运算符。这允许您编写一个比较ID的方法,这对于操作员的用户是不可见的。但是,这可能在您的查询中有效,因为它无法转换为SQL。

答案 1 :(得分:3)

如果您只是尝试比较对象而不必使用属性,则可以在类中覆盖Equals。然而,这是一个坏主意,因为它隐藏了正在发生的事情的逻辑。我强烈建议反对它