我有一个对象,其属性名称确切地命名了DB表中的字段名称,但我不确定如何插入它。 唯一不同的是DB表名。所以它是一个具有不同模型/映射表名称的对象,但我希望将它插入到一个名称与模型不同的表中。 我试过这个:
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
,但该表名为FooBarObj
,称为DBInformation
。
我怎样才能插入这样的东西?我正在使用Dapper
编辑:
我可以为FooBar模型提供两个表属性吗?
E.g。 [Table("DBInformation")]
和[Table("FooBar")]
。
我有一个奇怪的边缘情况,如果发生这种情况,我想插入FooBar,如果发生另一种情况,请插入DBInformation。这就是我目前面临的问题,因此我不能只为这个问题添加属性并完成。
答案 0 :(得分:4)
查看Dapper.Contrib项目。它允许您使用一些有用的属性来装饰模型类。
使用Table
类上的FooBar
属性来确定这应该映射到DBInformation
表。例如:
[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操作。例如,对于insert:
using (var conn = new SqlConnection(connectionString))
{
conn.Insert(myFooBar);
}
和更新:
using (var conn = new SqlConnection(connectionString))
{
conn.Update<FooBar>(myFooBar);
}
等
修改强>
要解决您的“真正”问题,(您最近的原始编辑),您需要根据特定方案插入两个表,然后我会回到调整您提供的SQL hardy中:
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);
}
答案 1 :(得分:1)
我认为flyte有很好的答案,他的解决方案当然可行,Dapper.Contrib项目非常有用。
只是给出另一种解决方案或至少稍微不同的方式来看待它。首先,我觉得所有实体应该只代表一个表,如果两个表分歧,它将在未来保持清晰。
所以你可能想要尝试做的是有两个类,其中副本扩展原始(或者是它的副本)。 然后在需要插入重复条目时使用映射器(选择任何一个)。
[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);
}
希望这有帮助。
答案 2 :(得分:0)
您可以使用EF或PetaPoco
如果您正在处理大数据,那么我的建议
您的对象
[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);
}
SET
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; }
}