使用Entity Framework包装现有数据库

时间:2010-12-16 12:40:22

标签: sql-server linq-to-sql entity-framework-4

我们合作的产品包含非常混乱的数据库(它不是我们的产品)

  • 未定义主键
  • 没有外键
  • 所有字段都允许null,null不具有任何特殊含义
  • 400桌

我们经常需要编写从数据库读取或写入数据的应用程序。

我想在数据库之上创建一个层,使我们的应用程序更容易使用。最后,我希望有一个层可以:

  1. 在阅读
  2. 时,将null值替换为type(“”,0等)的默认值
  3. 添加导航
  4. 使用LINQ
  5. 导出OData接口
  6. 用于Reporting Services(不是很重要)
  7. 所有这一切都必须在不改变数据库中的任何内容的情况下完成,即没有视图,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,我需要使用实体框架。问题是如果表没有主键(并且所有字段都允许为null,那么设计者只在模型中显示错误消息),实体框架根本不起作用

    关于如何做到这一点的任何想法?

    我知道它不会是自动的,我愿意投入一些时间来开发工具并手动编辑一些东西。数据库模式是稳定的,更改只包括新的列和表(即没有删除,名称更改或类型更改)

1 个答案:

答案 0 :(得分:1)

您可以使用LINQ to SQL进行OData。

也就是说,没有PK,EF工作正常(以及任何......)。想知道PK的是设计师。因此,您必须自己定义EDMX,使用Code-First,或者使用真正的PK制作“假”数据库来创建模型,然后在运行时切换到“无PK”版本。