创建基于脱离连接字符串的实体上下文



目标:

使用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);

如果您也不知道要插入到哪个表,那么通用方法会更好,因此您也可以使要插入的对象成为动态对象。

最新更新