Несколько.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=&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
  { }

}

1 ответ

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

Другие вопросы по тегам