Несколько.edmx в одном приложении Asp.Net MVC
Я создаю веб-сайт в ASP.Net MVC, и мне нужно получить доступ к 2 различным базам данных. В настоящее время я использую 2 файла.edmx, каждый со своей строкой подключения в файле web.config. У меня есть один файл метаданных, который описывает мои разные таблицы с необходимыми атрибутами. Моя проблема в том, что в контроллере я пытаюсь работать с обоими БД, но я получаю эту ошибку:
The entity type <object2Metadata> is not part of the model for the current context.
Я перепробовал все, что только мог придумать, например, использовать var и указывать только свои объекты, когда это необходимо, и эта ошибка будет появляться на разных этапах моего кода, независимо от того, насколько я стараюсь сделать это правильно.
Что я пытаюсь сделать: у меня есть две таблицы в двух разных базах данных, которые мне нужно сравнить их электронные письма и получить все учетные записи электронной почты, которые находятся в одной таблице, но не в другой, и поместить эти соответствующие объекты в список.
Я создал метаданные в своем проекте, которые отображают их в объекты. Объекты не одинаковы и не могут быть сопоставлены друг с другом, так как в object2 есть атрибуты, которых нет в object1, и нет соответствующего поля, поэтому я не могу просто преобразовать object2 в object1 и сделать сравнить. Я попытался просто извлечь электронные письма от каждого объекта и поместить их в свой список, а затем сравнить их и таким образом получить различия. Это работает, однако затем, когда я снова обращаюсь к db2, чтобы вытащить объекты с этими электронными письмами, я снова получаю эту ошибку. Кажется, я получаю сообщение об ошибке только тогда, когда начинаю пытаться использовать этот второй дБ. Я проверил мои строки подключения, и они верны. Это позволяет мне извлекать исходные объекты из db2 и помещать их в переменную. Так что я знаю, что строка подключения работает, но, похоже, ошибка возникает, когда я пытаюсь манипулировать данными из db2... если это имеет смысл.
Я сделал свое исследование, и я не могу найти ничего, что отвечает моей конкретной проблеме. Например: Несколько EDMX в одном проекте или Как создать несколько EDMX в одном проекте.
Вот несколько примеров кода того, что я делал: Контроллер -
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; }
}
}
Извините за длинный вопрос, так как я не уверен, какую именно проблему я хотел описать точно, что я делаю и как. В моем контроллере закомментировано много кода, просто показывающего вам разные вещи, которые я пробовал.
Если что-то не понятно, я могу ответить на любые вопросы или лучше что-то описать.
ОБНОВЛЕНИЕ: Строки подключения - Чтобы защитить себя от публикации личных данных, я выполнил поиск и нашел и заменил имена соединений на 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
{ }
}
1 ответ
Вы добавили или изменили какую-либо схему? Если это так, самый простой вариант - удалить оба EDMX и создать их заново.