标签: entity-framework-5

AutoMapper.dll中出现"AutoMapper.AutoMapperMappingException"类型的异常,但未在用户代码中处理

不知何故,我的代码不再起作用(它之前使用完全相同的代码工作).这就是问题:

代码

我正在尝试使用以下代码将一些对象映射到ViewModels:

组态:

Mapper.CreateMap<BookcaseItem, FoundBookcaseItemViewModel>()
    .ForMember(x => x.Title, opt => opt.MapFrom(src => src.Book.Title))
    .ForMember(x => x.Authors, opt => opt.MapFrom(src => src.Book.Authors.Select(x => x.Name).Aggregate((i, j) => i + ", " + j)))
    .ForMember(x => x.Identifiers, opt => opt.MapFrom(src => (!string.IsNullOrEmpty(src.Book.Isbn10) ? ("ISBN10: " + src.Book.Isbn10 + "\r\n") : string.Empty) +
                                                                (!string.IsNullOrEmpty(src.Book.Isbn13) ? ("ISBN13: " + src.Book.Isbn13) : string.Empty)))
    .ForMember(x => x.Pages, opt => opt.MapFrom(src => src.Book.Pages))
    .ForMember(x => x.ImageUri, opt => opt.MapFrom(src => src.Book.ThumbnailUriSmall));
Run Code Online (Sandbox Code Playgroud)

用法:

public ActionResult Index()
{
    string …
Run Code Online (Sandbox Code Playgroud)

c# debugging asp.net-mvc automapper entity-framework-5

11
推荐指数
1
解决办法
2万
查看次数

Entity Framework 5的新迁移功能是否完全支持枚举更改?

假设我们有以下简单模型:

public class Car
{
    public int Year { get; set; }
    public string Make { get; set; }
    public string Model { get; set; }
    public CarType Type { get; set; }
}

public enum CarType
{
    Car, Truck
}
Run Code Online (Sandbox Code Playgroud)

实体框架在向Car数据库添加新对象时,会将CarType枚举值存储为整数.

如果我们CarType以整数值更改的方式更改枚举(更改顺序或添加/删除值),Entity Framework是否知道如何使用迁移正确处理数据迁移?


例如,假设我们添加了另一个值CarType:

public enum CarType
{
    Car, Truck, Van
}
Run Code Online (Sandbox Code Playgroud)

这对数据库中的现有数据没有实际影响.0仍然是Car,1现在仍然如此Truck.但如果我们改变顺序CarType,就像这样:

public enum CarType
{
    Car, Van, Truck …
Run Code Online (Sandbox Code Playgroud)

migration enums entity-framework .net-4.5 entity-framework-5

11
推荐指数
1
解决办法
1080
查看次数

是否有一种扩展Code-First迁移的好方法

我正在开始一个使用Entity Framework的新项目.我已经研究了如何创建数据库的选项,并发现Code-First Migrations最有意义(如果您需要知道原因,请参阅底部).Code-First Migrations让我可以下载到任意SQL,这意味着我仍然可以完全控制.在实践中,我发现问题是,对于某些常见任务而言,降低到SQL似乎非常重复.

出于我的目的,我并不关心迁移中的扩展是否与提供程序无关(我在内的SQL不是).但是,我并没有在迁移框架中找到一个好的接缝或扩展点来添加这些东西.

举一个具体的例子,假设我想为MS-SQL复制指定一个RowGuid列.每次出现都采取的形式

Sql(
    string.Format(
        "Alter Table {0} Alter Column {1} Add ROWGUIDCOL",
        table,
        column ));
Run Code Online (Sandbox Code Playgroud)

所以我编写静态方法来摆脱一些冗余

Sql( MigrationHelper.SetRowGuid( table, column );
Run Code Online (Sandbox Code Playgroud)

-要么-

MigrationHelper.SetRowGuid(Sql, table, column); //passing the Sql method
Run Code Online (Sandbox Code Playgroud)

可能可以在DbMigration上制作这些扩展方法中的任何一种,并通过它来访问它们this. 但仍然看起来不合适:

CreateTable(
    "dbo.CustomerDirectory",
     c => new
         {
             Uid = c.Int(nullable: false),
             CustomerUid = c.Int(nullable: false),
             Description = c.String(nullable: false, maxLength: 50, unicode: false),
             RowGuid = c.Guid(nullable: false),
         })
     .PrimaryKey(t => t.Uid)
     .ForeignKey("dbo.Customer", t => t.CustomerUid);

this.SetRowGuid( Sql, "dbo.CustomerDirectory", "RowGuid" );
//Custom method here because of …
Run Code Online (Sandbox Code Playgroud)

c# sql entity-framework ef-migrations entity-framework-5

11
推荐指数
1
解决办法
2542
查看次数

覆盖Entity Framework 5 Code Code中的SaveChanges以复制旧旧库的行为

我们公司提供一套操作数据库中数据的各种应用程序.每个应用程序都有其特定的业务逻辑,但所有应用程序共享业务规则的公共子集.常见的东西包含在一堆用C++编写的遗留COM DLL中,它们使用"经典ADO"(它们通常调用存储过程,有时它们使用动态SQL).这些DLL中的大多数都具有基于XML的方法(更不用说基于专有格式的方法!)来创建,编辑,删除和检索对象,还有额外的操作,例如快速复制和转换许多实体的方法.

中间件DLL现在已经很老了,我们的应用程序开发人员需要一个新的面向对象(不是面向xml)的中间件,可以很容易地被C#应用程序使用.该公司的许多人都说我们应该忘记旧的范例,转而采用新的酷炫的东西,比如Entity Framework.他们对POCO的简单性很感兴趣,他们希望使用LINQ来检索数据(基于Xml的DLL查询方法不是那么容易使用,并且永远不会像LINQ那样灵活).

所以我正在尝试为简化场景创建一个模型(真实场景要复杂得多,在这里我只发布一个简化场景的简化子集!).我正在使用Visual Studio 2010,实体框架5代码优先,SQL Server 2008 R2.如果我犯了愚蠢的错误,请怜悯,我是Entity Framework的新手.由于我有许多不同的疑虑,我会将它们分别发布.这是第一个.传统的XML方法有这样的签名:

    bool Edit(string xmlstring, out string errorMessage)
Run Code Online (Sandbox Code Playgroud)

使用这样的格式:

<ORDER>
    <ID>234</ID>
    <NAME>SuperFastCar</NAME>
    <QUANTITY>3</QUANTITY>
    <LABEL>abc</LABEL>
</ORDER>
Run Code Online (Sandbox Code Playgroud)

Edit方法实现了以下业务逻辑:当Quantity更改时,必须对具有相同Label的所有Orders应用"自动缩放".例如,有三个订单:OrderA的数量= 3,标签= X.订单B的数量= 4,标签= X.订单C的数量= 5,标签= Y.我调用Edit方法为OrderA提供新的数量= 6,即我将OrderA的数量加倍.然后,根据业务逻辑,OrderB的数量必须自动加倍,并且必须变为8,因为OrderB和OrderA具有相同的标签.不得更改OrderC,因为它具有不同的标签.

我如何使用POCO类和实体框架复制它?这是一个问题,因为旧的Edit方法一次只能更改一个订单,而实体框架可以在调用SaveChanges时更改大量订单.此外,对SaveChanges的单次调用也可以创建新的订单.临时假设,仅适用于此测试:1)如果同时更改了许多订单数量,并且所有这些订单数量的比例因子都不相同,则不进行缩放; 2)新添加的订单即使具有相同的缩放订单标签也不会自动缩放.

我试图通过重写SaveChanges来实现它.

POCO课程:

using System;

namespace MockOrders
{
    public class Order
    {
        public Int64 Id { get; set; }
        public string Name { get; set; }
        public string Label { get; set; }
        public decimal Quantity { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

迁移文件(创建索引):

namespace MockOrders.Migrations
{
    using …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework savechanges code-first entity-framework-5

11
推荐指数
1
解决办法
5017
查看次数

删除具有一对多关系的子项的父项

我有一个带有Entity Framework 5.0 e Sql Server CE 4.0的.NET4.0应用程序.

我有两个实体,一对多(父/子)关系.我已将其配置为在父删除时级联删除,但由于某种原因它似乎不起作用.

这是我的实体的简化版本:

    public class Account
    {
        public int AccountKey { get; set; }
        public string Name { get; set; }

        public ICollection<User> Users { get; set; }
    }

    internal class AccountMap : EntityTypeConfiguration<Account>
    {
        public AccountMap()
        {
            this.HasKey(e => e.AccountKey);
            this.Property(e => e.AccountKey).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
            this.Property(e => e.Name).IsRequired();
        }
    }


    public class User
    {
        public int UserKey { get; set; }
        public string Name { get; set; }

        public Account Account { get; set; …
Run Code Online (Sandbox Code Playgroud)

entity-framework .net-4.0 sql-server-ce entity-framework-5

11
推荐指数
1
解决办法
1万
查看次数

将实体框架模型导航属性转换为DTO

我目前正在开发一个n层Web项目.在研究了数据传输对象及其优势后,我们决定采用这种模式.我们的ASP.NET MVC网站无法直接访问EF DbContext,而是使用DTO发送和接收实体数据.将有一个服务/映射层将在DTO和实体模型之间进行转换.

我的问题是,将实体模型导航属性转换为DTO的最佳方法是什么?

以下是项目中实体模型及其DTO的示例:

实体模型:

public class Payment
{
    public int ID { get; set; }
    public DateTime? PaidOn { get; set; }
    public decimal Amount { get; set; }
    public string Reference { get; set; }

    //Navigation Properties
    public virtual PaymentMechanism PaymentMechanism { get; set; }
    public virtual ICollection<Order> Orders { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

DTO:

public class PaymentDto
{
    public int ID { get; set; }
    public DateTime? PaidOn { get; set; }
    public decimal Amount { …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc dto entity-framework-5

11
推荐指数
1
解决办法
3583
查看次数

DbContext.saveChanges()中的NullReferenceException

以我的第一个babysteps与Entity Framework 5.0,我遇到了我创建的第一个实体的异常.

请注意,之后创建的每个表都可以正常工作.另外,请注意我已经采取了重新生成数据库和/或重新启动Visual Studio IDE的常规步骤.

使用Model-First,我创建了一个名为的简单表Contacts,定义为

  <EntityType Name="Contacts">
    <Key>
      <PropertyRef Name="ContactID" />
    </Key>
    <Property Name="ContactID" Type="int" StoreGeneratedPattern="Identity" Nullable="false" />
    <Property Name="Name" Type="nvarchar(max)" Nullable="false" />
  </EntityType>
Run Code Online (Sandbox Code Playgroud)

然后我尝试运行以下代码(来自ASP.NET页面的Page_Load)

            var contact = new DataContext.Contact { Name = aName };

            context.Contacts.Add(contact);
            context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

(使用aName!= null)

例外:

System.NullReferenceException was unhandled by user code
  HResult=-2147467261
  Message=Object reference not set to an instance of an object.
  Source=System.Web
  StackTrace:
       at System.Web.UI.ParseChildrenAttribute.GetHashCode()
       at System.Collections.Generic.ObjectEqualityComparer`1.GetHashCode(T obj)
       at System.Collections.Generic.HashSet`1.InternalGetHashCode(T item)
       at System.Collections.Generic.HashSet`1.AddIfNotPresent(T value)
       at System.Collections.Generic.HashSet`1.UnionWith(IEnumerable`1 other)
       at …
Run Code Online (Sandbox Code Playgroud)

c# asp.net entity-framework-5

11
推荐指数
2
解决办法
6947
查看次数

实体框架5代码首先将字符串映射到varchar全局

我正在玩EF 5和代码.到目前为止我真的很喜欢它,但我注意到它默认字符串列为nvarchar.如果我想使用varchar,那么我必须明确告诉它.

我可以强制它为字符串使用varchar而不是nvarchar,如下所示:

public class Member
{
    public int id { get; set; }

    [MaxLength(255), Required, Column(TypeName = "varchar")]
    public string firstName { get; set; }

    [MaxLength(255), Required, Column(TypeName = "varchar")]
    public string surname { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我几乎在所有情况下都会使用varchar而不是nvarchar,所以我更希望将字符串列全局映射到varchar,并且如果需要的话,能够在每列的基础上设置nvarchar.

有谁知道这样做的方法?我试图省略为模型中的每个字符串列键入[Column(TypeName ="varchar")]的需要.

ef-code-first entity-framework-5

11
推荐指数
3
解决办法
8142
查看次数

EF缓存:如何在将对象插入HttpRuntime缓存之前完全分离对象*?

一些背景:

使用:

  • .NET 4.5(考虑迁移到4.5.1,如果它是无痛的)
  • Web表单
  • 实体框架5,启用了延迟加载
  • 每个请求的上下文
  • IIS 8
  • Windows 2012 Datacenter

关注点:内存使用情况

在我们目前正在进行的项目上,可能是我们的第一个更大的项目,我们经常阅读一些来自CSV导入的大块数据,这些数据可能会在很长一段时间内保持不变.

除非有人明确地重新导入CSV数据,否则它们保证是相同的,这发生在我们项目中的多个位置,并且类似的方法用于一些常常由用户读取的常规文档.我们决定将这些数据缓存在HttpRuntime缓存中.

它是这样的,我们拉大约15,000条记录,主要是字符串.

//myObject and related methods are placeholders
public static List<myObject> GetMyCachedObjects()
{
    if (CacheManager.Exists(KeyConstants.keyConstantForMyObject))
    {
        return CacheManager.Get(KeyConstants.keyConstantForMyObject) as List<myObject>;
    }
    else
    {
        List<myObject> myObjectList = framework.objectProvider.GetMyObjects();
        CacheManager.Add(KeyConstants.keyConstantForMyObject, myObjectList, true, 5000);
        return myObjectList;
    }
}
Run Code Online (Sandbox Code Playgroud)

检索上述方法的数据非常简单,如下所示:

public List<myObject> GetMyObjects()
{
    return context.myObjectsTable.AsNoTracking().ToList();
}
Run Code Online (Sandbox Code Playgroud)

关于代码结构可能有些事情要说,但目前我并不关心这一点.

我一看到内存使用量很高就开始分析我们的项目,并发现许多部分可以优化我们的代码.我以前从未面对300个同时用户,我们自己完成的内部测试不足以显示内存问题.我已经突出显示并修复了许多内存泄漏,但我想了解一些与Entity Framework相关的未知数.

鉴于以上示例,并使用ANTS Profiler,我注意到' myObject '和其他类似对象引用了许多System.Data.Entity.DynamicProxies .myObject,此外还有许多EntityKeys可以保留整数.他们没有太多,但他们的数量相对较高.

例如,' myObject '的124个实例引用了近300个System.Data.Entity.DynamicProxies.

通常它看起来像这样,无论对象是什么: 一些缓存条目,一些我已缓存的对象,我现在注意到它们中的许多已经从dbContext事先缓存,动态代理和objectContext中分离出来.我不知道如何解开它们.

在此输入图像描述

我的进步:

我做了一些研究,发现我可能正在缓存实体框架与这些对象相关的东西.我用NoTracking拉它们但是内存中仍然存在那些可能还有其他东西的 …

asp.net caching memory-leaks entity-framework entity-framework-5

11
推荐指数
1
解决办法
992
查看次数

实体框架5 - 基于枚举的派生类的判别器

我有以下内容(为了清楚起见缩写) - 一个枚举,一个带有该枚举的基类,以及两个将枚举设置为特定值的派生类.

public enum MyEnum
{ 
    Value1, Value2
}

public class MyBaseClass
{ 
    public MyEnum { get; protected set; }
}

public class DerivedOne: MyBaseClass
{
    public DerivedOne { MyEnum = MyEnum.Value1; } 
}

public class DerivedTwo: MyBaseClass
{
    public DerivedTwo { MyEnum = MyEnum.Value2; }
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是让Entity Framework 5自动区分DerivedOne和DerivedTwo,并使用基于MyEnum值的鉴别器.我应该能够这样做,按照惯例,每个MyEnum == MyEnum.Value1代表DerivedOne,而MyEnum == MyEnum.Value2代表DerivedTwo.

我在我的DbContext中试过这个:

public class MyDbContext : DbContext
{
    DbSet<MyBaseClass> MyBaseClass { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<MyBaseClass>()
                    .Map<DerivedOne>(m => m.Requires(x …
Run Code Online (Sandbox Code Playgroud)

c# .net-4.0 ef-code-first entity-framework-5

10
推荐指数
2
解决办法
4686
查看次数