【问题标题】:What SQL ORM may i use to replace this old code我可以用什么 SQL ORM 来替换这个旧代码
【发布时间】:2010-03-02 09:17:27
【问题描述】:

抱歉,这个问题是针对我的问题的。

在学习反思的同时,我在一周内做了一个迷你 SQL ORM,然后在使用它一周的同时进行了一些小的调整。由于它的工作量很少,它实际上只与 sqlite 兼容。到目前为止我还没有遇到代码问题,但我想将它移植到支持 TSQL 或 MySql 的东西。

The example code is here 已过时,但在我的班级中具有最常用的功能。我也可以以最小的痛苦移植该代码的库。请注意,它必须支持外键。

【问题讨论】:

标签: c# sql orm


【解决方案1】:

我的建议是查看一些 ORM 的教程,然后选择最适合您的。

NHibernate reference documentation 建议在 30 分钟内启动并运行介绍章节中的示例。

我自己的 ORM 短名单是:

  • NHibernate
  • Linq 2 SQL

一些相关问题:

NHibernate 示例

// create and save an entity
var u = new User{ Name="foo", SignupDate=DateTime.Now };
session.Save( u );

// fetch and update entity, saving a related entity
var post = session.Get<Post>( 42 );
post.Tags["foo"].Count++;
session.Save( post );

// save a related item for an entity
post.Tags.Add( new Tag("Name")); 
session.Save( post );

一些示例映射和类:

public class User
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual DateTime SignupDate { get; set; }
}

public class Post
{
    public virtual int Id { get; set; }
    public virtual User User { get; set; }
    public virtual string Title { get; set; }
    public virtual string Body { get; set; }
    public virtual IList<Tag> Tags { get; set; }
}

public class Tag
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual string Count { get; set; }
}

<class name="User" table="user">
  <id name="Id">
    <generator class="native" />
  </id>
  <property name="Name" />
  <property name="SignupDate" />
</class>

<class name="Post" table="post">
  <id name="Id">
    <generator class="native" />
  </id>
  <property name="Title" />
  <property name="Body" type="StringCLob" /> <!-- ntext -->
  <many-to-one name="User" />
  <bag name="Tags" table="post_tag" cascade="save-update">
      <key column="postid" />
      <many-to-many class="Tag" column="tagid" />
  </bag>
</class>

<class name="Tag" table="tag">
  <id name="Id">
    <generator class="native" />
  </id>
  <property name="Name" />
  <property name="Count" />
</class>

【讨论】:

  • +1 但我想说的是,您的候选名单中的 IIRC 都需要时间来启动和运行?我最担心的是没有 ORM 允许你编写一个简单的类并插入它
  • 是的。映射需要嵌入到您的类库中。
  • +1 NHibernate 在我看来是 .NET 最先进的 ORM 工具,甚至在 EF4(实际上是版本 2)之前。
  • 对不起,伙计,我没来得及选择答案。我更喜欢这个。
【解决方案2】:

对于这样一个简单的数据模型,我会考虑使用 Linq 2 Sql 或 SubSonic,并倾向于 SubSonic。

我使用过 Lightspeed 2,但没有使用新发布的版本 3。所以 Lightspeed 3 也可能是一个不错的选择。对于我们的 Lightspeed 项目,我们还研究了六七个其他 ORM,包括 nHibernate。光速是第二快的。最快的 ORM 生成了一些非常时髦的模型!

任何一个提到的 ORM 加上那些没有提到的都可以完成这项工作。我认为这将归结为您想为对象建模付出多少努力以及您的个人偏好是什么。

我更喜欢 SubSonic,因为您所要做的就是在 T4 模板中设置三个变量并将其放入文件夹中。所有代码都会自动生成。此外,如果需要,您可以根据自己的喜好调整模板。

【讨论】:

  • 你能帮我清理一下吗,上次我查看 SubSonic 时,它似乎没有任何外键,如果我插入标签内有标签的媒体元素不会插入到数据库中(只是在这种情况下为 0 的 id,因为它还不存在)。还是这样吗?
  • 是的,在保存子记录方面确实需要一些工作。此链接可能会有所帮助frozenmountain.com/blog/post/…
  • 嗯,我更喜欢它的原生支持。我的
【解决方案3】:

Mindscape Lightspeed 拥有 NHibernate 和 EntityFramework 中的大部分常见内容,并且可以在 POCO 中工作

支持 SQL Server、MySQL 和许多其他工具

大量示例、教程和快速友好的个人帮助

微软甚至聘请了它的一位设计师来开发 EntityFramework

试试看

【讨论】:

  • 我无法用 POCO 判断它是否支持引用/外键并插入子数据(json 形式的示例数据:bill { productid, tranaction_data { date, location }, customer})
  • Lightspeed 2.0 和 3.0 支持 POCO.... 框架要求从它们的 Entity 基类继承,这强加了自己的限制,其中最重要的是称为 Id 的只读主键。
猜你喜欢
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
  • 2013-02-15
  • 1970-01-01
相关资源
最近更新 更多