根据场景插入应映射到不同数据库 table 的对象
Inserting object that should be mapped into different DB table depending on scenario
我有一个对象,其属性名称准确地命名了数据库中的字段名称table,但我不确定如何插入它。
唯一不同的是 DB table 名称。所以它是一个名称不同 model/mapped table 的对象,但我希望将它插入到名称与模型不同的 table 中。
我试过这个:
var val = info.FooBarObj;
conn.Execute("insert DBInformation(val) values(@val)", new { val = val });
例如
对象是 FooBarObj
,属性是 int Id, string Foo, string Bar
并且 DBInformation
具有字段名称:Id, Foo, and Bar
但 table 不称为 FooBarObj
,而是称为 DBInformation
。
如何插入这样的内容?我正在使用 Dapper
编辑:
我可以为 FooBar 模型设置两个 table 属性吗?
例如[Table("DBInformation")]
和 [Table("FooBar")]
.
我有一个奇怪的边缘情况,如果发生这种情况,我想插入到 FooBar 中,如果发生另一种情况,则插入到 DBInformation 中。这就是我目前面临的问题,因此这就是为什么我不能只添加属性并解决这个问题的原因。
查看 Dapper.Contrib 项目。它允许您用一些有用的属性装饰您的模型 classes。
使用 FooBar
class 上的 Table
属性来确定这应该映射到 DBInformation
table。例如:
[Table("DBInformation")]
public class FooBar
{
#region Properties
[ExplicitKey] // Use this attribute if your ID field is not automatically generated, (identity)
public int Id { get; set; }
public string Foo { get; set; }
public string Bar { get; set; }
...
}
使用 Dapper.Contrib 的另一个好处是它可以让您非常轻松地执行 CRUD 操作。例如,对于插入:
using (var conn = new SqlConnection(connectionString))
{
conn.Insert(myFooBar);
}
以及更新:
using (var conn = new SqlConnection(connectionString))
{
conn.Update<FooBar>(myFooBar);
}
等等
编辑
为了解决您的 "real" 问题(您对原始版本的最新编辑),您可能需要根据特定情况插入两个 tables,然后我会去回到只调整你提供的 SQL dapper:
string theTable = someCondition : "DBInformation" : "FooBar";
using (var conn = new SqlConnection(connectionString))
{
conn.Insert(myFooBar);
string insertSql = $"INSERT INTO {theTable} ([Id], [Foo], [Bar]) VALUES @FooBarObj.Id, @...)";
var result = conn .Execute(insertSql , myFooBar);
}
我认为 flyte 有很好的答案,他的解决方案肯定可行,Dapper.Contrib 项目非常有用。
只是为了提供另一种解决方案,或者至少是一种稍微不同的看待它的方式。首先我觉得所有实体应该只代表一个table,这样以后两个table分叉的时候就清楚了。
因此,您可能想要尝试做的是有两个 类,其中副本扩展了原始文件(或者是原始文件的副本)。
然后在需要插入重复条目时使用映射器(选择任何一个)。
[Table("Original")]
public class Original
{
//properties
}
[Table("Duplicate")]
public class Duplicate : Original
{
//properties
}
然后当你的条件满足时。
if (something)
{
var dup = _mapper.Map<Original, Duplicate>(orig);
conn.Insert(dup);
}
希望对您有所帮助。
您可以使用 EF 或 PetaPoco
- 我的建议是PetaPoco,因为它非常简单和有效。
如果你正在处理大数据那么我的建议
- EntityFramework
你的对象
[TableName("Administrators")]
[PrimaryKey("dbid", autoIncrement = true)]
class Administrators
{
public int dbid { get; set; }
public string Name { get; set; }
public string SurName { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
}
插入语句
var Administrators= new Administrators{
Name = "Mami",
Surname= "Dora"
};
object getObj= db.Insert(Administrators);
基本示例(获取和设置)
App.config
<connectionStrings>
<add name="PetaExample" connectionString="Data Source=MDORA17\SQLEXPRESS;Initial Catalog=mdblog;Integrated Security=True;Connect Timeout=300;" providerName="System.Data.SqlClient" />
</connectionStrings>
GET
static void Main(string[] args)
{
using (var db = new Database("PetaExample"))
{
try
{
var result = db.Query<Administrators>("select * from mdpub.Administrators").ToList();
result.ForEach(ShowPerson);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
Console.ReadKey();
}
private static void ShowPerson(Administrators admin)
{
Console.WriteLine("{0} {1} ", admin.Name, admin.SurName);
}
设置
static void Main(string[] args)
{
using (var db = new Database("PetaExample"))
{
try
{
var Administrators = new Administrators
{
Name = "Mami",
SurName = "Dora",
};
db.Insert("mdpub.Administrators", "dbid", true, Administrators);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
Console.ReadKey();
}
}
public class Administrators
{
public int dbid { get; set; }
public string Name { get; set; }
public string SurName { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
}
我有一个对象,其属性名称准确地命名了数据库中的字段名称table,但我不确定如何插入它。 唯一不同的是 DB table 名称。所以它是一个名称不同 model/mapped table 的对象,但我希望将它插入到名称与模型不同的 table 中。 我试过这个:
var val = info.FooBarObj;
conn.Execute("insert DBInformation(val) values(@val)", new { val = val });
例如
对象是 FooBarObj
,属性是 int Id, string Foo, string Bar
并且 DBInformation
具有字段名称:Id, Foo, and Bar
但 table 不称为 FooBarObj
,而是称为 DBInformation
。
如何插入这样的内容?我正在使用 Dapper
编辑:
我可以为 FooBar 模型设置两个 table 属性吗?
例如[Table("DBInformation")]
和 [Table("FooBar")]
.
我有一个奇怪的边缘情况,如果发生这种情况,我想插入到 FooBar 中,如果发生另一种情况,则插入到 DBInformation 中。这就是我目前面临的问题,因此这就是为什么我不能只添加属性并解决这个问题的原因。
查看 Dapper.Contrib 项目。它允许您用一些有用的属性装饰您的模型 classes。
使用 FooBar
class 上的 Table
属性来确定这应该映射到 DBInformation
table。例如:
[Table("DBInformation")]
public class FooBar
{
#region Properties
[ExplicitKey] // Use this attribute if your ID field is not automatically generated, (identity)
public int Id { get; set; }
public string Foo { get; set; }
public string Bar { get; set; }
...
}
使用 Dapper.Contrib 的另一个好处是它可以让您非常轻松地执行 CRUD 操作。例如,对于插入:
using (var conn = new SqlConnection(connectionString))
{
conn.Insert(myFooBar);
}
以及更新:
using (var conn = new SqlConnection(connectionString))
{
conn.Update<FooBar>(myFooBar);
}
等等
编辑
为了解决您的 "real" 问题(您对原始版本的最新编辑),您可能需要根据特定情况插入两个 tables,然后我会去回到只调整你提供的 SQL dapper:
string theTable = someCondition : "DBInformation" : "FooBar";
using (var conn = new SqlConnection(connectionString))
{
conn.Insert(myFooBar);
string insertSql = $"INSERT INTO {theTable} ([Id], [Foo], [Bar]) VALUES @FooBarObj.Id, @...)";
var result = conn .Execute(insertSql , myFooBar);
}
我认为 flyte 有很好的答案,他的解决方案肯定可行,Dapper.Contrib 项目非常有用。
只是为了提供另一种解决方案,或者至少是一种稍微不同的看待它的方式。首先我觉得所有实体应该只代表一个table,这样以后两个table分叉的时候就清楚了。
因此,您可能想要尝试做的是有两个 类,其中副本扩展了原始文件(或者是原始文件的副本)。 然后在需要插入重复条目时使用映射器(选择任何一个)。
[Table("Original")]
public class Original
{
//properties
}
[Table("Duplicate")]
public class Duplicate : Original
{
//properties
}
然后当你的条件满足时。
if (something)
{
var dup = _mapper.Map<Original, Duplicate>(orig);
conn.Insert(dup);
}
希望对您有所帮助。
您可以使用 EF 或 PetaPoco
- 我的建议是PetaPoco,因为它非常简单和有效。
如果你正在处理大数据那么我的建议
- EntityFramework
你的对象
[TableName("Administrators")]
[PrimaryKey("dbid", autoIncrement = true)]
class Administrators
{
public int dbid { get; set; }
public string Name { get; set; }
public string SurName { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
}
插入语句
var Administrators= new Administrators{
Name = "Mami",
Surname= "Dora"
};
object getObj= db.Insert(Administrators);
基本示例(获取和设置)
App.config
<connectionStrings>
<add name="PetaExample" connectionString="Data Source=MDORA17\SQLEXPRESS;Initial Catalog=mdblog;Integrated Security=True;Connect Timeout=300;" providerName="System.Data.SqlClient" />
</connectionStrings>
GET
static void Main(string[] args)
{
using (var db = new Database("PetaExample"))
{
try
{
var result = db.Query<Administrators>("select * from mdpub.Administrators").ToList();
result.ForEach(ShowPerson);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
Console.ReadKey();
}
private static void ShowPerson(Administrators admin)
{
Console.WriteLine("{0} {1} ", admin.Name, admin.SurName);
}
设置
static void Main(string[] args)
{
using (var db = new Database("PetaExample"))
{
try
{
var Administrators = new Administrators
{
Name = "Mami",
SurName = "Dora",
};
db.Insert("mdpub.Administrators", "dbid", true, Administrators);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
Console.ReadKey();
}
}
public class Administrators
{
public int dbid { get; set; }
public string Name { get; set; }
public string SurName { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
}