【问题标题】:How to Exclude a model from being part of the database when using MVC and Entity Framework使用 MVC 和实体框架时如何将模型排除在数据库中
【发布时间】:2017-05-09 23:58:14
【问题描述】:

我目前正在使用 SQL Server DB 和 Code First EF 编写一个 .NET MVC 应用程序。一切都很顺利,stackoverflow 非常有帮助。不幸的是,我遇到了一个无法解决的问题,并且在 Internet 上找不到任何帮助。

我想与 PayPal 集成,我关注的是 http://logcorner.com/asp-net-mvc-paypal-integration,这似乎相当简单,除了 VS 想要为我的 PayPal 模型创建一个数据库表,而我不需要或不想要它。我在类前面添加了[NotMapped],但现在它会产生这个错误:

“MyApp.Models.PayPal”类型未映射。使用 Ignore 方法或 NotMappedAttribute 数据注释检查该类型是否被显式排除。验证该类型是否被定义为一个类,不是原始的或泛型的,并且不是从 EntityObject 继承的。

我看到了一些关于在我的数据库上下文的OnModelCreating() 方法中添加 Ignore(lambda 表达式) 的其他信息,但这似乎是为了排除一列,而不是整个类。

有什么想法吗?我不希望我的应用程序中的每个模型都有一个数据库表。

【问题讨论】:

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


    【解决方案1】:

    默认情况下,所有模型都将在数据库中创建,该数据库是 myAppEntities : DbContext 类的一部分,属性类型为 DbSet<>。如果您将模型 MyApp.Models.PayPal 装饰为 notmappedattribute。

    [NotMapped]
    public class PayPal
    {
    //your all properties
    }
    

    然后从继承自 DbContext 类的类中删除 Dbset<PayPal> 属性。

        public class MyAppEntities : DbContext
            {
                public DbSet<PayPal> paypal { get; set; } //Remove this or comment this line
                ...
                ...
               //rest of your properties
        }
    

    这样做不会成为您数据库的一部分,您也不会收到此错误。 (这件事的解释将涵盖整个主题,我在这里无法解释)。

    【讨论】:

    • 成功了,谢谢@Rajput。我没有注意到 DbContext 类添加了 public System.Data.Entity.DbSet PayPals { get;放; } 在底部。
    • 被标记为答案并被赞成,但显然我的代表太低了,无法计算我的赞成票。衷心感谢您的快速回复。
    【解决方案2】:

    您对[NotMapped] 属性的使用是正确的。问题是 (a) 您尝试在此属性生效时搭建脚手架,或者 (b) 您尝试访问与这种类型在运行时。那是我在测试工作中看到这个错误的时候(见下文)。

    在设计结束时,以下将解决您的问题如果您正在使用自动脚手架(但见后文):

    1. 在您面向 PayPal 的课程中​​删除或注释掉 [NotMapped]
    2. 重新编译。 (由于 MVC 对代码的自省存在延迟, 在您执行此操作之前,您过去的属性仍然有效。)
    3. 现在开始搭建脚手架。
    4. 现在取消注释或重新添加[NotMapped]
    5. 出于与之前相同的原因再次重新编译。

    如果您遇到问题,则没有太多理由使用自动脚手架,因为您不想保存数据,因此不需要 CRUD 操作。与 IDE 为您生成的相比,您的 refsite 上的示例使用了几乎空的控制器。

    在运行时结束时(即在您的控制器代码中),请确保您从不接触数据库。 绝对不像db.SaveChanges(); 你不应该像我说的那样需要;这实际上是一个 ViewModel,它的存在只是为了将数据推送到 PayPal。


    为了验证问题和解决方案,我创建了一个示例 MVC 应用程序,得到您看到的消息,采取设计时步骤,然后在浏览器中运行应用程序,再次得到问题消息,删除面向 db 的代码来自我的未映射类控制器,并且能够让事情正常工作。我没有使用面向 PayPal 的类,而是使用更简单的类以节省时间,但结果应该没有区别。

    我希望这能解决您的问题。 --埃德

    【讨论】:

    • 感谢您的详细解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 2011-08-23
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多