实体框架5 - 寻找中心点执行自定义代码实体从数据库加载后(Entity Framework 5

2019-07-19 07:23发布

我使用实体框架5码第一种方法,并使用实体配置流利的API。 我的项目有一个特定的产品实体,其获取数据的一半来自数据库和通过WCF客户端检索的数据合同的另一半(使用它的第三方系统管理产品库存)。 数据契约是产品实体类(属性或方法我还没有决定)的成员。

我不希望有任何WCF客户端逻辑包含实体内。 我宁愿保持库代码这个逻辑(的DbContext,DbSet等)。

那么,有没有一种产品实体从数据库中检索刚过挂钩到实体框架(或拦截)的技术? 我应该注意到产品实体显示为对其他实体的导航属性。 如果钩或拦截可能那么这意味着什么是我可以从后立即EF从数据库加载的产品实体的SOAP服务检索数据合同。 我的项目的效益是WCF客户端检索代码并不需要在整个应用程序重复。

我有一个想法是实现IDbSet的数据合同和IDbSet将负责取回它。 然后以某种方式欺骗EF以为其对产品实体导航属性。 但我不知道,如果一个数据库DbSet可以用非数据库混合所有相同的DbContext内IDbSet。 同时,也是另一个问题 - 如何将EF知道来检索IDbSet植入导航属性? 我更愿意知道这个想法是投入时间到之前可能。 我也宁愿知道从哪里开始寻找。

请注意,我一直在使用.NET工作超过10年,但这EF5东西还是比较新的给我。

提前致谢。

萨姆

Answer 1:

今天,我发现,这似乎是我所期待的实体框架的事件。 ObjectContext.ObjectMaterialized事件 。 显然,实现的DbContext其中IObjectContextAdapter在圈暴露的ObjectContext。 从那里,我可以订阅ObjectMaterialized事件。

MSDN读取 :当从数据源中的数据创建为一个查询或负载操作的一部分的新实体对象时发生。

下面的代码演示怎么使用ObjectMaterialized事件解决我的问题在我的喜好之一是有一个中心点放置WCF客户端访问逻辑。

// seperate assembly - does not use Domain.Repositories assembly
namespace Domain.Models
{
    // the data contract
    [DataContract]
    public class ProductInventoryState
    {
        [DataMember]
        public int StockStatus { get; set; }

        [DataMember]
        public IEnumerable<String> SerialNumbers { get; set; }

        // etc....
    }

    // the entity
    public class Product
    {
        public Guid Key { get; set; }
        public string ProductCode { get; set; }
        public ProductInventoryState InventoryState { get; set; }
        // etc....
    }
}

// seperate assembly - uses Domain.Models assembly
namespace Domain.Repositories
{
    public class MainRepository : DbContext
    {
        public MainRepository()
        {
            ((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized += ObjectContext_ObjectMaterialized;
        }

        protected void ObjectContext_ObjectMaterialized(object sender, ObjectMaterializedEventArgs e)
        {
            if (e.Entity == null)
                return;

            if (e.Entity is Product)
            {
                Product product = (Product)e.Entity;

                // retrieve ProductInventoryState from 3rd party SOAP API
                using (ThirdPartyInventorySystemClient client = new ThirdPartyInventorySystemClient())
                {
                    // use ProductCode to retrieve the data contract
                    product.InventoryState = client.GetInventoryState(product.ProductCode);
                }
            }
        }    
    }
}


Answer 2:

1)你可以写自己的EF提供商(但是这是不小的任务)

2)您可以将项目范围内,但无法保存。

所述entity.State可以如附后未改性来设置。 你也可以从保存更改之前上下文中删除这样的条目

3)你可以写一个仓库fascade,入住EF和检查位置2和结合的结果。

在导航性能的问题。 您将需要非常仔细地指定这些以免出现问题。 不懒加载与否甚至建模。

我不会尝试,他们的个人混合。
你可以告诉EF忽略某些属性。 所以,你可以有一个很好的原POCO,但只有那些在DB的位模型。

然后,POCO将收集休息。

我使用的是fascade与事件自己去执行的上下文/ DBset关键方法。 这样我就可以触发事件连接,获取,保存等。

祝好运



文章来源: Entity Framework 5 - Looking for Central Point to Execute Custom Code after Entity is Loaded from Database