2016-10-21 2 views
3

Я создаю сайт в ASP.Net MVC, и мне нужно получить доступ к двум различным базам данных. В настоящее время я использую 2 файла .edmx со своей собственной строкой соединения в файле web.config. У меня есть один файл метаданных, который описывает мои разные таблицы с необходимыми атрибутами. Моя проблема заключается в том, что в контроллере я стараюсь работать как с БД, но я получаю эту ошибку:Несколько .edmx в одном приложении ASP.NET MVC

The entity type <object2Metadata> is not part of the model for the current context. 

Я попробовал все, что я могу думать, например, с помощью вар и только специально печатая свои объекты, когда необходимо, и эта ошибка будет просто появляться на разных этапах моего кода, независимо от того, как сильно я пытаюсь это исправить.

Что я пытаюсь выполнить: у меня есть две таблицы в двух разных базах данных, которые мне нужно сравнить с их электронными письмами и получить все учетные записи электронной почты, которые находятся в одной таблице, но не в другой, и поставить те соответствующие объекты в списке.

Я создал метаданные в своем проекте, который отображает их в объекты. Объекты не совпадают и не могут быть сопоставлены друг с другом, поскольку объект object2 имеет в нем атрибуты, которые не существуют в объекте1, и нет соответствующего поля, поэтому я не могу просто преобразовать object2 в object1 и сделать сравните. Я попытался просто вытащить электронные письма из каждого объекта и поместить их каждый в свой собственный список, а затем сравнить их и получить различия таким образом. Это работает, однако тогда, когда я снова получаю доступ к db2, чтобы вытащить объекты, которые имеют эти электронные письма, я снова получаю эту ошибку. Кажется, я только получаю ошибку, когда начинаю пытаться использовать этот 2-й бит. Я проверил строки подключения, и они верны. Это позволяет мне вытаскивать исходные объекты из db2, помещая их в var..so я знаю, что строка соединения работает, но кажется, что ошибка возникает, когда я пытаюсь манипулировать данными из 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 

Вот мой MetaData для двух объектов -

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

Извините за длительный вопрос, так как я «Не знаю, какой именно вопрос я хотел бы точно описать, что я делаю и как. У меня есть много кода, прокомментированных в моем контроллере, просто показывая вам разные вещи, которые я пробовал.

Если что-то неясно, я могу ответить на любые вопросы или лучше описать что-то.

UPDATE: Connection Strings - Чтобы защитить себя от публикации личных данных, я выполнил поиск и нашел и заменил имена соединений с 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=&quot;data source=myServer;initial catalog=db1;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" 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=&quot;data source=myServer;initial catalog=db2;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" 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 
    { } 

} 
+0

Эта ошибка более вероятна из-за неправильных строк подключения. Не могли бы вы разместить строку подключения? –

+0

Я обновил свой вопрос, чтобы включить connectionStrings в соответствии с запросом @NagarajRaveendran – kwebb46

+0

Строки подключения выглядят хорошо! –

ответ

0

Вы добавили или изменили какой-либо из схемы?Если это так, самым простым вариантом является удаление обоих EDMX и их создание снова

+0

вряд ли самый простой и, скорее всего, не решит проблему, потому что как только он снова их создаст, он столкнется с той же проблемой. Файлы EDMX часто включают в себя множество настроек, которые необходимо будет воссоздать. –