【问题标题】:Unable to insert new records using Entity Framework 6 + Code First + Castle Windsor无法使用 Entity Framework 6 + Code First + Castle Windsor 插入新记录
【发布时间】:2014-01-04 11:43:53
【问题描述】:

我知道这可能是一个简单的问题,但我对建筑很陌生,我想把它做好。所以,谢谢你的理解。

我也是 Castle Windsor 的新手,既不使用工作单元也不使用存储库模式 - 我什至不知道是否需要它们来解决我目前遇到的问题。

我想要完成的事情:

我有一个名为 IDomain 的接口,它只有一些属性和一个具体的 POCO 类 Domain 来实现它。

IDomain界面:

public interface IDomain : IPersistentObject
{
    int DomainId { get; set; }

    string Name { get; set; }

    [LocalizedString]
    string ItemName { get; set; }

    [LocalizedString]
    string ItemDescription { get; set; }

    int ItemValue { get; set; }
}

POCO 类:

public class Domain : AbstractDefault, IDomain, ILocalizedEntity
{
    public virtual int DomainId { get; set; }

    public virtual string Name { get; set; }

    [LocalizedString]
    public virtual string ItemName { get; set; }

    [LocalizedString]
    public virtual string ItemDescription { get; set; }

    public virtual int ItemValue { get; set; }
}

我的 DomainService.cs 类这样做:

    public void Insert(IDomain param)
    {
        using (var db = new DefaultContext())
        {
            new DomainValidation(new DbMetaData().GetMetaData, Settings.Default.CultureName).Validate(param);

            db.Domains.Add((Domain)param);
        }
    }

另一个重要信息是我正在使用 AOC,即,我正在拦截对我的 Domain 类的方法调用。查看我的 Windsor 容器安装程序:

public class Installers : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(Component
            .For<IInterceptor>()
            .ImplementedBy<Class1>()
            .Named("DomainInterceptor"))

            .Register(Component
            .For<IDomain>()
            .ImplementedBy<Domain>()
            .LifestyleTransient()
            .Interceptors(InterceptorReference.ForKey("DomainInterceptor")).Anywhere);
    }
}

在我正在做的单元测试中:

var domain = container.Resolve<IDomain>(); // Returns IDomainProxy, not IDomain
domain.Name = "MIN_MAX";
domain.ItemName = new LocalizedProperty("en-US", "Mininum").Serialize();
domain.ItemValue = (int)MinMax.Minimum;

new DomainService().Insert(domain); // If I try to cast by doing .Insert(domain as Domain), I get a null

但当我的代码到达“.Add(Domain)param)”(DomainService.cs)时,我收到错误消息:“无法投射对象'Castle.Proxies.IDomainProxy' 类型的类型为 'Model.Domain'。"

考虑到我确实想使用 IoC、Windsor 等,为什么会出现此错误以及我应该如何修复它?

最好的问候。

【问题讨论】:

    标签: entity-framework inversion-of-control castle-windsor castle-dynamicproxy aop


    【解决方案1】:

    在这种情况下,Castle Windsor 会使用“代理”接口创建新实例。我最终在我的服务类中使用了AutoMapper

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-02
      • 1970-01-01
      • 2012-04-17
      • 2011-04-06
      • 2013-05-20
      • 1970-01-01
      相关资源
      最近更新 更多