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

时间:2016-08-23 12:30:06

标签: c# entity-framework

目标:

使用EF从API的POST请求输入数据。 POST请求将包含一个“ID”,它会将connection string映射到enumconnection string的名称与Web.config中的context名称相同。创建“基础”SqlCommand对象,并将对象添加到适当的表中。

注意:

我知道我可以使用entity framework执行此操作,但我想使用POST代替它,但我碰到了一堵墙。

我已经使用EF多年了,但是我想让这个context.TABLE.Add(object)方法成为全局的,因为我可以得到它。此API将接受来自众多不同网站的大量请求,但所有网站都将使用相同的模型。每个网站POST都将进入不同的数据库(这就是他们的请求)。

我预见的问题是,每个“实体”都知道它包含哪些表。因此,当一种类型public class DbConnectionNames { public enum DbConnectionStringNames { SocHopeHcpEntities = 1, // "1" is passed into the POST to map XXXXEntities = 2, ...... } } 时,EF了解您希望将此“Car”对象放在“Car”表中(显然)。

可以使用“全局”实体来完成吗

<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();
}
YYYEntities.Context.cs

修改

我的EF不使用POCO,但已经开始使用数据库了。可能有XX个不同的数据库,都持有相同的类似表。我已经自动生成了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; } }

<String, String>

2 个答案:

答案 0 :(得分:2)

您仍然需要一个了解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();
}

答案 1 :(得分:1)

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

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