【问题标题】:ORM which can insert entity into more than one tableORM 可以将实体插入到多个表中
【发布时间】:2014-04-22 11:50:15
【问题描述】:

我在 SQL Server 中有几个这样的表

表1

Id (pk), 名称

表2

Table1_Id (fk), 标题, 描述, 一些数据

从代码插入时(使用 C#),我希望避免必须发出两个请求来创建此数据。

是否有 ORM 或类似 Simple.Data 之类的东西,如果我调用它会处理它

var myObject = new MyObject()
{
    Name = "Name",
    Description = "Description",
    Title = "Title",
    SomeData = "SomeData"
};
db.Table1.Insert(myObject);

我想可能有一些足够聪明的东西可以识别这里使用的外键?

我猜这里的主要困难是我的 ID 会被 SQL 自动递增,因此映射外键可能会很棘手。

谢谢!

【问题讨论】:

  • 产品/图书馆推荐?根据常见问题解答,这里不欢迎。
  • 您可以将问题改写为“如何使用任何 ORM 将实体存储到多个表中?”

标签: c# sql entity-framework nhibernate orm


【解决方案1】:

你可以使用实体框架来做。

基本上,您定义一个实体,然后将其映射到一个 SQL 表之外。

即您可以定义一个抽象实体 Person 和具体实体 Employes 和 Managers,并让它们继承 Person。

然后在映射中,您将共享属性映射到 Person SQL 表以及Employees 和 Managers SQL 表上的特定属性。

网上有几个关于如何使用的教程。即

生成的代码与您发布的类似:

using (var db = new TestContext()){
  db.Managers.Add(new Manager { Name = "a", ... });
  db.SaveChanges();
}

【讨论】:

  • 问题中没有继承。
  • 这就是我们最终的结果。这个问题没有明确包括继承,但这里使用的方法仍然适用于我的情况,谢谢!
【解决方案2】:

使用 NHibernate 很容易做到这一点。

使用连接(以 XML 为例,也可以通过代码映射):

<class name="MyObject" table="Table1">
  <id .../>
  <property name="Name" />

  <join table="table2">
    <key column="Table1_Id" />
    <property name="Description" />
    <property name="Title" />
    <property name="SomeData" />
  </join>
</class>

它对 C# 代码完全透明。无需更改您的实体(例如,使用基类或其他东西)。

var myObject = new MyObject()
{
    Name = "Name",
    Description = "Description",
    Title = "Title",
    SomeData = "SomeData"
};
session.Save(myObject);

【讨论】:

    猜你喜欢
    • 2021-06-25
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多