使用实体框架包装现有数据库
我们使用的产品包含一个非常混乱的数据库(这不是我们的产品)
- 没有定义主键
- 没有外键
- 所有字段都允许 null,但 null 没有任何特殊含义
- 400 个表
我们经常需要编写从数据库读取或写入数据的应用程序。
我想在数据库之上创建一个层,使其更容易在我们的应用程序中使用。最终,我希望有一个层可以:
- 在阅读时将空值替换为类型的默认值(“”、0 等)
- 添加导航
- 使用 LINQ
- 导出 OData 接口
- 在 Reporting Services 中使用(不是很重要)
所有这些都必须是完成时没有更改数据库中的任何内容,即没有视图、SP 等。
我用 Linq2Sql 做了一些实验,看起来效果很好。 使用 sqlmetal 和一些正则表达式魔法,我创建了如下所示的实体:
[Column(Name="Quantity", CanBeNull = true, DbType="Int")]
private int? _Quantity;
...
[Column(Storage = "_Quantity", DbType = "Int")]
public int Quantity {
get { return _Quantity ?? 0; }
set { _Quantity = value; }
}
然后我手动添加所需的导航属性。
不幸的是,现在投资 linq2sql 似乎是一件坏事。如果我想要 OData,我需要使用实体框架。问题是,如果表没有主键(并且所有字段都允许为空,因此设计器只在模型中显示错误消息),实体框架将根本无法工作。
关于如何做到这一点有什么想法吗?
我知道它不会是自动的,并且愿意投入一些时间来开发工具并手动编辑一些东西。数据库模式稳定,更改仅包括新列和表(即没有删除、名称更改或类型更改)
A product we work with contain a very messy database (it is not our product)
- No primary keys defined
- No foreign keys
- All fields allow null without null having any special meaning
- 400 tables
We often need to write applications that read or write data from the database.
I would like to create a layer on top of the database that make it a bit easier to use in our applications. Ultimately I would like to have a layer that can:
- Replace null values with default for type ("", 0 etc) when reading
- Add navigation
- Use LINQ
- Export an OData interface
- Be used in Reporting Services (not very important)
All of this must be done without changing anything in the database, i.e. no views, SP etc.
I have done some experiments with Linq2Sql which seem to work pretty well.
With sqlmetal and some regex magic I create entities which looks like:
[Column(Name="Quantity", CanBeNull = true, DbType="Int")]
private int? _Quantity;
...
[Column(Storage = "_Quantity", DbType = "Int")]
public int Quantity {
get { return _Quantity ?? 0; }
set { _Quantity = value; }
}
and then I manually add needed navigation properties.
Unfortunately it seems like investing in linq2sql is a bad thing to do now. If I want OData I need to go with entity framework. The problem is that entity framework will not work at all if the tables don't have a primary key (and all fields allow null so the designer just show error messages in model)
Any ideas on how to do this?
I understand that it will not be automatic and am willing to invest some time in developing tools and manually edit some things. The database schema is stable and changes only include new columns and tables (i.e. no deletes, name changes or type changes)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您可以使用 LINQ to SQL 执行 OData。
也就是说,EF 可以在没有 PK 的情况下正常工作(以及其他任何事情......)。 设计师想知道PK。因此,您必须自己定义 EDMX、使用 Code-First,或者使用真实 PK 制作“假”数据库来创建模型,然后在运行时切换到“无 PK”版本。
You can do OData with LINQ to SQL.
That said, the EF works OK (as well as anything...) without a PK. It's the designer which wants to know the PK. So you must either define the EDMX yourself, use Code-First, or make a "fake" DB with real PKs to create your model, then switch to the "no PK" version at runtime.