创建基于脱离连接字符串的实体上下文
本文关键字:实体 上下文 字符串 连接 于脱离 创建 | 更新日期: 2023-09-27 18:03:31
目标:
使用EF输入来自API的POST请求中的数据。POST请求将包含一个"ID",它将把connection string
映射到enum
,CCD_2的名称与Web.config
中的名称相同。创建"基本"context
对象,并将该对象添加到相应的表中。
注意:
我知道我可以用SqlCommand
来做这件事,但我想用entity framework
来尝试一下,但我碰壁了。
我已经使用EF很多年了,但我想让这个POST
方法尽可能地全球化。这个API将接受来自许多不同网站的大量请求,但所有网站都将使用相同的模型。每个网站POST都会进入一个不同的数据库(这就是他们请求的方式(。
我预见到的问题是,每个"实体"都知道它包含哪些表。因此,当一个人键入context.TABLE.Add(object)
时,EF明白你想把这个"Car"对象放在"Car"表中(显然(。
这可以使用"全局"实体来完成吗???
public class DbConnectionNames
{
public enum DbConnectionStringNames
{
SocHopeHcpEntities = 1, // "1" is passed into the POST to map
XXXXEntities = 2,
......
}
}
<add name="SocHopeHcpEntities" connectionString=".........." />
<add name="XXXXEntities" connectionString=".........." />
.....
var professional = new Professional
{
....
....
};
string connStringContext = Enum.GetName(typeof(DbConnectionNames.DbConnectionStringNames), model.FormId).ToString();
string connectionString = ConfigurationManager.ConnectionStrings[connStringContext].ConnectionString;
using (var context = new ObjectContext(connectionString))
{
context.Professionals.Add(professional); // obviously this doesn't work
context.SaveChanges();
}
编辑:
我的EF没有使用POCO,但一开始就已经基于DB了。可能有XX个不同的数据库,所有数据库都持有相同的相似表。我已经有一个自动生成的YYYEntities.Context.cs
文件,它继承自DbContext
:
public partial class SocHopeHcpEntities : DbContext
{
public SocHopeHcpEntities()
: base("name=SocHopeHcpEntities")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public virtual DbSet<AreasOfWork> AreasOfWorks { get; set; }
public virtual DbSet<Professional> Professionals { get; set; }
}
您仍然需要一个了解Professional
是什么的上下文。例如:
public class ProfessionalContext : DbContext
{
public ProfessionalContext(string connectionString)
: base(connectionString)
{
//This line is optional but it prevents initialising the database
//every time you connect to a new database
Database.SetInitializer<ProfessionalContext>(null);
}
public DbSet<Professional> Professionals { get; set; }
}
并像这样使用:
using (var context = new ProfessionalContext(connectionString))
{
context.Professionals.Add(professional);
context.SaveChanges();
}
DavidG的回答向您展示了如何将连接字符串传递到强类型上下文,该上下文知道您正在处理的实体类型。该上下文继承自DbContext,您可以直接使用它,如下所示。
值得注意的是,通用方法不涉及特定于数据库的上下文"对象"。
例如,请参阅此处如何使用ObjectContext:
System.Data.Objects.ObjectContext oc = new System.Data.Objects.ObjectContext("connection string");
oc.AddObject("ProfessionalsTable", professional);
另一个例子是使用DbContext:
System.Data.Entity.DbContext dbc = new DbContext("");
dbc.Set(typeof(Professional)).Add(professional);
如果您也不知道要插入到哪个表,那么通用方法会更好,因此您也可以使要插入的对象成为动态对象。