单独区域,跨命名空间错误 - 无法确定类型

时间:2017-08-08 11:25:46

标签: c# asp.net-mvc entity-framework asp.net-mvc-4

我的MVC应用程序中出现了标准的1:1实体错误:

无法确定类型之间关联的主要结束... 必须使用关系流畅API或数据注释显式配置此关联的主要结尾。

但是,与调用MVC控制器的区域和命名空间不同,会抛出错误。我根据多个Stack Overflow问题/答案(很多重复)审查了我的关系,并为这两个区域设置了我的实体correctly

Fulfillment命名空间 SyncServer 控制器发出错误。网站上的整个实施区域没有错误 - 因此,关系是正确的(完整的CRUD可用)。

但是,当浏览网站的SyncServer MVC区域时,我会为Fulfillment实体抛出错误。 Fulfillment Area在开发中排名第二,同一个Sync Server Area代码在生产中运行没有问题。因此,Sync Server实体也已正确设置。如果相同的SyncServer代码在隔离中正确运行,并且Fulfillment组合运行作为第二个区域,则每组实体似乎都可以正确设置。所以也许有某种类型的无意识的交叉。

每个区域都有自己的注册类,并具有明确定义的命名空间,例如:

// AreaName = Fulfillment
context.MapRoute(
      "Fulfillment_default",
      string.Concat(AreaName, "/{controller}/{action}/{id}"),
      new { controller = "Home", action = "Index", id = UrlParameter.Optional },
      new string[] { "ProcessManager.ManagementConsole.Areas.Fulfillment.Controllers.MVC" }
);

// AreaName = SyncServer
context.MapRoute(
     "SyncServer_default",
     string.Concat(AreaName, "/{controller}/{action}/{id}"),
     new { controller = "Home", action = "Index", id = UrlParameter.Optional },
     new string[] {"ProcessManager.ManagementConsole.Areas.SyncServer.Controllers.MVC"}
);

履行定义:

namespace ProcessManager.ManagementConsole.Areas.Fulfillment.Models.API {
    [Table("OrderBook")]
    public partial class OrderBook
    {
        public OrderBook() {}

        [Key]  // I've tried omitting this and defining exclusively in FluentAPI
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ID { get; set; }

        ...

        [ForeignKey("OrderBookID")]  // I've tried omitting this
        public virtual OrderData OrderData { get; set; }
    }

    [Table("OrderData")]
    public partial class OrderData
    {
        public OrderData() { }

        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int OrderBookID { get; set; }

        ...

        [ForeignKey("OrderBookID")]  // I've tried omitting this and defining exclusively in FluentAPI
        public virtual OrderBook OrderBook { get; set; }
    }
}

履行OnModelCreating:

 modelBuilder.Entity<OrderBook>()
        .HasRequired(c1 => c1.OrderData)
        .WithRequiredPrincipal(c2 => c2.OrderBook);

SyncServer定义:

namespace ProcessManager.ManagementConsole.Areas.SyncServer.Models.MVC {
    [Table("BAppJobOrderBook")]
    public partial class BAppJobOrderBook
    {
        [StringLength(50)]
        public string ID { get; set; }

        ...

        (no relationships)
    }
}

让我觉得有一些交叉的唯一共性是控制器名称,尽管它们仍然不同(多个)。

namespace ProcessManager.ManagementConsole.Areas.SyncServer.Controllers.MVC {
public class OrderBookController : Controller
{
    private Models.MVC.SyncServer db = new Models.MVC.SyncServer();

namespace ProcessManager.ManagementConsole.Areas.Fulfillment.Controllers.MVC {
public class OrderBooksController : Controller
{
    private Models.MVC.Fulfillment db = new Models.MVC.Fulfillment();

最后,在OrderBook的SyncServer视图中出现错误的代码(仅作为示例,所有SyncServer视图都在async Task<ActionResult> Index方法中抛出错误。)

var objs = from s in db.BAppJobOrderBooks select s;

那么,是什么原因可能导致每个区域单独运行以及在不同区域的同一个应用程序上运行时抛出错误?当明确定义和分离所有名称空间(模型,控制器和视图)时,为什么会出现重叠?我错过了什么?

1 个答案:

答案 0 :(得分:0)

正如您可能已经知道的那样,这个错误是由于您的实体在EF方面没有明确的关系造成的,所以我不会太担心MVC方面的问题 - 这在您的数据存储中是个麻烦。在不同服务器上相同代码的工作方式不同的情况下,我首先要确认所有迁移都已在所有位置运行。您的模型没有描述OrderBookOrderData中的哪一个是主体,因此设置的唯一位置来自OnModelCreating中的流畅代码。

这向我建议了两件事之一 - 由于某种原因你的OnModelCreation代码被跳过(检查那里的断点是否被击中)或者你的数据库与你的模型没有正确匹配。如果您没有在本地运行模型创建迁移(或者您在更改它之前已经运行它并且迁移历史记录表中有一个条目,因此EF认为它不需要再次运行它)那么可能存在不匹配EF期望在那里找到什么以及出现什么。另一个有用的策略是从头开始创建一个新的数据库并检查它是否正常工作。

无论哪种方式,问题的核心都是这种关系,并且通过将注意力集中在事物的EF方面,你应该能够合理地解决这个问题。