我正在 ASP.Net MVC 中创建一个网站,我需要访问 2 个不同的数据库。我目前正在使用 2 个 .edmx 文件,每个文件在 web.config 文件中都有自己的连接字符串。我有一个元数据文件,它用必要的属性描述了我的不同表格。我的问题是,在一个 Controller 中,我试图同时使用两个数据库,但我不断收到此错误:
The entity type <object2Metadata> is not part of the model for the current context.
我已经尝试了所有我能想到的方法,例如使用 var 并仅在必要时专门输入我的对象,并且该错误只会在我的代码中的不同步骤中弹出,无论我如何努力使其正确。
我想要完成的事情:我在两个不同的数据库中有两个表,我需要比较它们的电子邮件并获取一个表中但不在另一个表中的所有电子邮件帐户,然后将这些列表中的相应对象。
我在我的项目中创建了元数据,将这些映射到对象中。对象不一样,不能映射到彼此相等,因为 object2 具有 object1 中不存在的属性,并且没有相应的字段,所以我不能只将 object2 转换为 object1 并执行一个比较。我试过从每个对象中提取电子邮件并将它们分别放入自己的列表中,然后比较它们并以这种方式获得差异。这行得通,但是当我再次访问 db2 以提取具有这些电子邮件的对象时,我再次收到该错误。似乎只有在我开始尝试使用第二个数据库时才会出现错误。我检查了我的连接字符串,它们是正确的。它让我从 db2 中提取初始对象并将它们放入 var..所以我知道连接字符串有效,但是当我尝试从 db2 操作数据时似乎发生了错误...如果这有意义的话。
我已完成研究,但找不到任何可以回答我的具体问题的内容。 如:Multiple edmx in one project或 How to create multiple edmx in same project .
以下是我一直在做的一些代码示例: Controller -
namespace project.Controllers
{
public class myController: Controller
{
//both these statements compute just fine with no errors.
private db1Entities db = new db1Entities();
private db2Entities adb = new db2Entities ();
// GET: Exchange
public ActionResult Index(int? page)
{
//Getting my initial lists from the db's
//Both these statements compute with no errors as well
var mbe = db.table1.AsEnumerable().ToList();
var abe = adb.table2.AsEnumerable().ToList();
//This list would be used for me to convert Obj2 into Obj1
List<object1> abeConverted = new List<object1>();
//This list would then hold the items in List<obj2> that aren't
//in List<obj1>
List<object1> abeDiff = new List<object1>();
////Here's where I was going to try to just filter by email
//List<string> mbeEmails = new List<string>();
//List<string> abeEmails = new List<string>();
//Here is where I actually converted obj2 into obj1-no error here
foreach (object2 a in abe)
{
object1 m = new object1 ();
m.pk_email = a.mail;
if (a.secureMail.Equals('F'))
m.isSecure = false;
else
m.isSecure = true;
m.jobCode = null;
m.workOrder = null;
m.isDisabled = false;
m.isNonBillable = false;
m.createdDate = a.createdDate;
abeConverted.Add(m);
}
//Here's where I would have extracted emails to lists from obj's
//foreach (var m in mbe)
//{
// string e = "";
// e = m.pk_email;
// mbeEmails.Add(e);
//}
//foreach (var a in abe)
//{
// string e = "";
// e = a.mail;
// abeEmails.Add(e);
//}
////Email lists compare to get differences
//List<string> diffEmails = (from a in abeEmails
// join m in mbeEmails on a equals m into d
// from od in d.DefaultIfEmpty()
// where od == null
// select a).ToList<string>();
//compare to get differecnes by objects after the obj2 convert
//Here is where the error pops up by using this approach.
abeDiff = (from a in abeConverted
join m in mbe on a.pk_email equals m.pk_email into d
from od in d.DefaultIfEmpty()
where od == null
select a).ToList();
//This would be used if needed to get the objects after the email
//compare. Here is where the error pops up using this filtered
//emails approach.
//foreach (string e in diffEmails)
//{
// object2 a = new object2 ();
// a = abe.Where(b => b.mail == e).FirstOrDefault();
// abeDiff.Add(a);
//}
//Turning my list into a pagedList object for the view
int pageSize = 20;
int pageNumber = (page ?? 1);
var abePage = abeDiff.OrderBy(a =>
a.pk_email).ToPagedList(pageNumber, pageSize);
ViewBag.abePage = abePage;
return View(abeDiff.OrderBy(a =>
a.pk_email).ToPagedList(pageNumber, pageSize));
}
}
} //end Controller
这是我的两个对象的元数据 -
namespace project.Models
{
public class Metadata
{
}
public class object1Metadata
{
[Display(Name = "Email")]
[Required]
public string pk_email { get; set; }
[Display(Name = "Job Code")]
[Required]
public string jobCode { get; set; }
[Display(Name = "Work Order")]
[Required]
public string workOrder { get; set; }
[Display(Name = "Secure?")]
[Required]
public bool isSecure { get; set; }
[Display(Name = "Disabled?")]
public bool isDisabled { get; set; }
[Display(Name = "Non-Billable?")]
[Required]
public bool isNonBillable { get; set; }
[Display(Name = "Date Created")]
[Required]
public DateTime createdDate { get; set; }
}
public class object2Metadata
{
//[Display(Name = "ID")]
//public double Id { get; set; }
[Display(Name = "Department Number")]
public string departmentNumber { get; set; }
[Display(Name = "Division")]
public string division { get; set; }
[Display(Name = "Agency")]
public string agency { get; set; }
[Display(Name = "Department Name")]
public string departmentName { get; set; }
[Display(Name = "Name")]
public string name { get; set; }
[Display(Name = "Email")]
public string mail { get; set; }
[Display(Name = "Size")]
public string mbSize { get; set; }
[Display(Name = "Distinguished Name")]
public string distinguishedName { get; set; }
[Display(Name = "Instant Messaging")]
public string instantMessaging { get; set; }
[Display(Name = "Secure Mail")]
public string secureMail { get; set; }
[Display(Name = "Account Type")]
public string typeOfAccount { get; set; }
[Display(Name = "Extract Date")]
public DateTime extractDate { get; set; }
[Display(Name = "Created Date")]
public DateTime createdDate { get; set; }
}
}
很抱歉这个冗长的问题,因为我不确定我想准确描述我在做什么以及如何做的确切问题。我在我的 Controller 中注释了很多代码,只是向您展示我尝试过的不同的东西。
如果有什么不清楚的地方,我可以回答任何问题或更好地描述一些事情。
更新:连接字符串 --为了保护自己不发布私有(private)数据,我进行了搜索,找到并用 db1 和 db2 替换了连接名称,并将服务器名称替换为 myServer。 我确保在所有出现的地方都输入了正确的名称,并且服务器名称是正确的...所以这两件事不会成为问题。
<connectionStrings>
<add name="db1Entities" connectionString="metadata=res://*/Models.db1.csdl|res://*/Models.db1.ssdl|res://*/Models.db1.msl;provider=System.Data.SqlClient;provider connection string="data source=myServer;initial catalog=db1;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
<add name="db2Entities" connectionString="metadata=res://*/Models.db2.csdl|res://*/Models.db2.ssdl|res://*/Models.db2.msl;provider=System.Data.SqlClient;provider connection string="data source=myServer;initial catalog=db2;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
</connectionStrings>
我们为我们的实体类使用元数据类型的部分类......如下:
namespace project.Models
{
public class PartialClasses
{
}
[MetadataType(typeof(object1Metadata))]
public partial class object1
{ }
[MetadataType(typeof(object2Metadata))]
public partial class object2
{ }
}
最佳答案
您是否添加或更改了任何架构?如果是这样,最简单的选择是删除两个 EDMX 并重新创建它们
关于asp.net-mvc - 单个 Asp.Net MVC 应用程序中的多个 .edmx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40181401/