标签: poco

为什么我的Entity Framework Code First代理集合为null,为什么我不能设置它?

我正在使用DBContext并且有两个类,其属性都是虚拟的.我可以在调试器中看到,当我查询上下文时,我正在获取代理对象.但是,当我尝试添加它时,collection属性仍为null.我认为代理将确保集合初始化.

因为我的Poco对象可以在其数据上下文之外使用,所以我在构造函数中添加了对集合为null的检查,并在必要时创建它:

public class DanceStyle
{
    public DanceStyle()
    {
        if (DanceEvents == null)
        {
            DanceEvents = new Collection<DanceEvent>();
        }
    }
    ...
    public virtual ICollection<DanceEvent> DanceEvents { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这在数据上下文之外工作但是如果我使用查询检索对象,虽然测试是真的,但是当我尝试设置它时,我得到以下异常:'类型'DanceStyle_B6089AE40D178593955F1328A70EAA3D8F0F01DDE9F9FBD615F60A34F9178B94'上的属性'DanceEvents'无法设置,因为集合已经设置为EntityCollection.

我可以看到它是null并且我无法添加它,但我也不能将它设置为集合,因为代理已经设置它.因此我无法使用它.我糊涂了.

这是DanceEvent类:

public class DanceEvent
{
    public DanceEvent()
    {
        if (DanceStyles == null)
        {
            DanceStyles = new Collection<DanceStyle>();
        }
    }
    ...
    public virtual ICollection<DanceStyle> DanceStyles { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我从上面的代码中省略了其他值类型属性.我在上下文类中没有其他类的映射.

collections entity-framework poco proxies

41
推荐指数
2
解决办法
3万
查看次数

Automapper:使用Entity Framework 4 Proxy Pocos在集合上映射继承和抽象基类的问题

我在使用AutoMapper(这是一项出色的技术)时遇到了一个问题,即将业务对象映射到DTO,在DTO中我从集合中的抽象基类继承.

这是我的对象:

abstract class Payment
class CashPayment : Payment
class CreditCardPayment : Payment
Run Code Online (Sandbox Code Playgroud)

我还有一个发票对象,其中包含一系列付款,如下所示:

    public class Invoice
    {
       ... properties...

       public ICollection<Payment> Payments { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

我还有每个这些对象的相应DTO版本.

DtoInvoice对象定义为:

[DataContract]
public class DtoInvoice
{
   ...properties...

   [DataMember]
   public List<DtoPayment> Payments { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这就是我的Mapper定义:

Mapper.CreateMap<Invoice, DtoInvoice>();

Mapper.CreateMap<Payment, DtoPayment>()
  .Include<CashPayment, DtoCashPayment>()
  .Include<CreditCardPayment, DtoCreditCardPayment>();

Mapper.CreateMap<CashPayment, DtoCashPayment>();
Mapper.CreateMap<CreditCardPayment, DtoCreditCardPayment>();
Run Code Online (Sandbox Code Playgroud)

执行映射的代码如下所示:

var invoice = repo.GetInvoice(invoiceId);

var dtoInvoice = Mapper.Map<Invoice, DtoInvoice>(invoice);
Run Code Online (Sandbox Code Playgroud)

因此,例如,如果我的发票对象包含特定付款的集合(比如1现金和1张信用卡),当映射器尝试映射它们时,我会收到错误,即无法创建抽象类付款.如果我从Payment对象中删除了abstract关键字,那么代码可以工作,但我只收到Payment对象的集合,我没有得到他们的特定对象(现金和信用卡付款).

所以问题是:如何让AutoMapper映射特定的支付类型而不是基类?


更新

我做了一些挖掘,并认为我发现了一个问题,但我不确定如何使用AutoMapper解决这个问题.我认为这更像是EF的事情,而不是AutoMapper的错.:-)

在我的代码中,我使用延迟加载的Entity Framework 4代理POCO.

因此,当我尝试映射从EF返回的实体(代理POCO)时,它会获得如下滑稽的类型:

System.Data.Entity.DynamicProxies.CashPayment_86783D165755C316A2F58A4343EEC4842907C5539AF24F0E64AEF498B15105C2
Run Code Online (Sandbox Code Playgroud)

所以我的理论是,当AutoMapper尝试将CashPayment映射到DtoCashPayment并且传入的付款属于代理类型时,AutoMapper将其视为"不匹配",然后映射通用付款类型.但由于Payment是一个抽象类AutoMapper炸弹,其中包含"System.InvalidOperationException:无法创建抽象类的实例".例外.

所以问题是:我有没有办法使用AutoMapper将EF POCO代理对象映射到Dtos.

.net collections entity-framework poco automapper

39
推荐指数
5
解决办法
2万
查看次数

究竟什么是"持久性无知"?

持久性无知通常被定义为持久化和检索标准.NET对象的能力(如果您真的坚持给它们命名,则为POCO).一个看似公认的标准.NET对象定义是:

"...普通的课程,你专注于手头的业务问题而不添加与基础设施相关的原因......"

但是,我看到人们将NHibernate描述为一个允许持久性无知的框架,但它是一个不能在任何标准.NET对象上工作的框架,只有符合特定设计要求的标准.NET对象,例如(源代码):

  • 所有类都必须具有默认构造函数
  • 除非打开类并且所有成员都是虚拟的,否则某些功能不起作用
  • 除非您滥用Equals/GetHashCode,否则对象标识无法正常运行

(旁白:在任何人不高兴之前,我并不打算在这里选择NHibernate,它只是一个经常被引用的框架示例,据说允许持久性无知.我敢肯定类似的论点可以应用于其他声称相同的ORM .)

现在虽然这个类本身没有任何持久性特定于框架的属性或基类等,但对我而言,它实际上并不是"持久性无知",因为它必须遵循一套设计指南以便所选持久性框架的使用.您必须考虑到持久性框架的要求来设计和实现该类; 如果你不了解它,那么这个班可能无法使用它.

当我在与"持久性无知" /"POCO"的定义问题是,我不知道怎么样,从概念上讲,这是真的有什么不同,以添加属性,如[Serializable][DataContract][XmlType]或任何其他持久性框架,具体的注解这有利于使用该框架的实体的持久性和检索.

那么,"持久性无知"到底是什么?

很明显,将它定义为能够持久化"普通类"是一种谬误,因为NHibernate只是在没有引用特定于框架的类的情况下是普通的,而它们非常特殊,因为它们需要不寻常的设计选择,例如默认构造函数和所有类-virtual成员和可变类型的Equals/GetHashCode实现.

因此,当对象促进使用持久性框架(在设计和结构中或通过使用特定于框架的注释)但不执行任何持久性逻辑时,"持久性无知"是否合理?

nhibernate orm data-access poco persistence-ignorance

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

为什么DbSet.Add工作得如此之慢?

8个月前在这里讨论了同样的话题:如何加速DbSet.Add()?.除了使用我们不接受的SqlBulkCopy之外,没有提出任何解决方案.我决定再次提出这个问题,希望围绕这个问题有新的想法和想法,并提出其他解决方法.至少我只是好奇为什么这个操作需要很长时间才能运行.

好吧,问题是:我必须将30K实体更新到数据库(EF 4.1,POCO).实体类型非常简单,包含整数Id +其他4个整数属性,与其他类型无关.2例:

  • 所有这些都是新记录.每个实体逐个运行context.Entities.Add(entity)需要90秒,Cntx.Configuration.AutoDetectChangesEnabled = false(true值使其永久运行).然后SaveChanges只需要一秒钟.其他方法:将它附加到像这样的上下文需要相同的90秒:

    Cntx.Entities.Attach(entity);
    Cntx.Entry(entity).State = EntityState.Added;
    
    Run Code Online (Sandbox Code Playgroud)
  • 它们都是现有的记录,有一些变化.在这种情况下,将它附加到现有数据上下文只需几毫秒,如下所示:

    Cntx.Entities.Attach(entity);
    Cntx.Entry(entity).State = EntityState.Modified;
    
    Run Code Online (Sandbox Code Playgroud)

    看到不同?

Add方法背后的原因是什么让它的工作速度非常慢?

performance entity-framework poco entity-framework-4.1

33
推荐指数
1
解决办法
5503
查看次数

什么是POCO的实体框架

使用POCO有什么好处?我不明白持久性无知的含义,这是什么意思?poco对象不能暴露像Save这样的东西?我无法绕过这个POCO,周围有很多嗡嗡声.

与EF生成的实体和POCO有什么区别?

.net c# entity-framework poco

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

自我跟踪实体与POCO实体

我们正在开始一个新的基于Web的产品,我们计划通过WCF服务公开我们的业务逻辑.我们将使用ASP.NET 4.0,C#,EF 4.0.将来我们希望基于这些服务构建iphone应用程序和WPF应用程序.我一直在阅读很多关于使用POCO和自我跟踪实体(STE)的内容,据我所知,STEs在网络方案中效果不佳.任何人都能更清楚地了解这个问题吗?

asp.net wcf poco entity-framework-4 self-tracking-entities

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

实体框架使用排序顺序加载子集合

我有两个表父表和子表.子表具有列排序顺序(数值).由于缺少EF的支持来持久化IList包含排序顺序而不暴露排序顺序(请参阅:实体框架持久化子集合排序顺序)我的子类还有一个属性SortOrder,因此我可以存储具有排序的子项订购.

与引用问题的autor相反,我尝试加载始终排序的子项.因此,如果我加载一个我期望的父实例,那么子集合按排序顺序排序.如何使用Code First Fluent API和POCO实现此行为?

提示:在子集合上调用.Sort(...)不是一个选项.

entity-framework poco code-first ef-code-first

31
推荐指数
2
解决办法
3万
查看次数

如何修复:关系约束中的从属角色和主要角色中的属性数必须相同?

我正在使用实体框架4.3.1对SQL Server 2012数据库,我正在使用POCO方法.我收到以下错误,我想知道是否有人可以解释如何解决它:

ModelValidationException

在模型生成期间检测到一个或多个验证错误:\ tSystem.Data.Entity.Edm.EdmAssociationConstraint ::关系约束中的从属角色和主要角色中的属性数必须相同.

没有InnerException任何进一步的信息.

我无法更改数据库架构,这有点奇怪,但这里是......

  • **是主键(注意我有复合主键)
  • (FK)表示外键

以下是表格(如果它有助于我发布SQL以生成它们,但我不认为这些表实际上是问题,因为例外是在模型的验证中):

One
-
**OneId int not null
**TwoId int not null (FK)
**ThreeId int not null (FK)
Name nvarchar(50) not null

Two
-
**TwoId int not null
**ThreeId int not null (FK)
Name nvarchar(50) not null

Three
-
**ThreeId not null
Name nvarchar(50) not null
Run Code Online (Sandbox Code Playgroud)

这是实体(注意我在模型中包含外键但不是那个非常标准的):

public class Three
{
    public int ThreeId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Two> …
Run Code Online (Sandbox Code Playgroud)

.net c# entity-framework poco entity-framework-4.3

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

使用POCO和mongodb c#驱动程序时如何管理_id字段

如果我想用POCO读写mongo数据

public class Thingy
{
     public string Foo {get;set;}
}
...
coll.Insert(new Thing(Foo = "hello"));
Run Code Online (Sandbox Code Playgroud)

当我回读时,我得到一个失败,说_id是一个意外的属性(它是).然后我在课堂上添加了一个名为_id的字段.现在插入不起作用,说_id字段不能为null.一个尝试过的BsonIgnoreIfNull属性,它没有用.

c# poco mongodb

30
推荐指数
3
解决办法
3万
查看次数

在MVC中实例化和处理DbContext的最佳方法是什么?

MVC 3 + EF 4.1

我在两种方法中选择处理DbContext:

  1. 实例化Application_BeginRequest,投入 HttpContext.Current.Items和处置Application_EndRequest.
  2. 创建一次性UnitOfWork(用于包装DbContext),并启动每个控制器操作using(var unitOfWork = new UnitOfWork()) { ... }

请分享您的经验:您更喜欢哪一个?每种方法的利弊是什么?

asp.net-mvc entity-framework poco entity-framework-4.1 dbcontext

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