C# 使用POCO和ObjectCotext从EFcontextprovider自定义元数据

C# 使用POCO和ObjectCotext从EFcontextprovider自定义元数据,c#,breeze,asp.net-web-api,C#,Breeze,Asp.net Web Api,我是breezejs的新手,正在尝试开发一个有棱角微风的水疗中心。 我有一个名为POCOObjectContext的类,它是从基类ObjectContext继承的。我的数据库有一个名为Customer的表,还有一个名为Customer的POCO。但是我有一些关于POCO客户的额外属性,比如Email、SupplierName,它们不是表列。当我从EFContextProvider获取Metadat()时,它只提供名为Customer的表中的列。但是保存POCO命名客户的上下文具有我声明的所有属性

我是breezejs的新手,正在尝试开发一个有棱角微风的水疗中心。
我有一个名为POCOObjectContext的类,它是从基类ObjectContext继承的。我的数据库有一个名为Customer的表,还有一个名为Customer的POCO。但是我有一些关于POCO客户的额外属性,比如Email、SupplierName,它们不是表列。当我从EFContextProvider获取Metadat()时,它只提供名为Customer的表中的列。但是保存POCO命名客户的上下文具有我声明的所有属性。因此,在BreezeJS中,当从breeze.EntityManager创建对象时,它是根据Customer表中的列创建的,但我需要元数据中的这些额外属性来获取数据并将数据保存到我的数据库中。我们将非常感谢您的帮助

这是上下文类POCOObjectContext(tmpDataBaseEntities是ConnectionString)

最后是微风控制器

    [BreezeController]
    public class ReceiveServiceController : ApiController
    {
        EFContextProvider<POCOObjectContext> _pocoContext = new EFContextProvider<POCOObjectContext>();

        ReceiveDal _rcvDal = new ReceiveDal();

        [HttpGet]
        public string Metadata()
        {
           var t = _pocoContext.Metadata();
           return t; // It holds the properties info that match with POCO and Database Table.
        }
    }
[BreezeController]
公共类ReceiveServiceController:ApiController
{
EFContextProvider_pocoContext=新EFContextProvider();
ReceiveDal _rcvDal=新的ReceiveDal();
[HttpGet]
公共字符串元数据()
{
var t=_pocoContext.Metadata();
返回t;//它保存与POCO和数据库表匹配的属性信息。
}
}

正如您所发现的,发送到客户端的元数据定义中不包括服务器上的自定义未映射属性。但是,您可以通过这样做来扩展客户的客户定义

//Assuming you have camelCase naming convention enabled
function Customer() {
    this.supplierName = '';
    this.email = '';
}

entityManager.metadataStore.registerEntityTypeCtor('Customer', Customer);
现在,当您调用saveChanges时,Breeze将在负载中包含上述自定义属性

{"Id": 42, "Name": "Customer Name","__unmapped":{"supplierName":"Supplier Name", "email": "supplier@supplier.com"},...}
然后,在服务器上,您可以检查并解析JObject负载以检索未映射的属性

有关在客户端上扩展Breeze实体的更多信息,请访问


希望这有帮助。

感谢Denisk的回复,我已经阅读了主题(扩展实体)。当POCO(客户)较小时,这就足够了。但在实际业务中,它有8到10个属性,如City、Country、CustomerCategory、CustomerType等,这些属性与具有各自ID的Customer表相关。因此,通过在js和c#end中定义这些属性来管理代码变得更加繁琐和困难。在从BreezeControllerAPI获取数据到js的情况下,我无法发送带有这些字段值的数据,因为元数据没有准备这些额外字段。我明白了。也许您可以解释一下这些额外的未映射字段的用例是什么?如果您有很多,而且它们对业务逻辑至关重要,那么为什么不将它们也存储在数据库中呢?是的,您是对的。所有这些字段都存储在数据库中。在CustomerTypeTable中。其中包含CustTypeID和CustTypeName列。此CustTypeID是对Customer表的引用。。。因此,当我要查看数据时,我会在CustomerTypeTable和Customer之间进行内部连接,在C#中,我的Customer poco有两个属性CustTypeID和CustTypeName来保存客户的数据,无需使用CustomerType poco。在这种情况下,EFContextProvider无法在客户poco中生成具有此属性CustTypeName的元数据。我想我需要的是POCO的元数据,而不是objectcontext方式的表。是的,正如您所提到的,您可以通过包含那些未映射的字段来修改发送给客户端的元数据,尽管我没有足够的经验来告诉您该方法是否可维护。您还可以考虑重新设计模型,只包括那些在客户端的业务上下文中真正需要的未映射字段。
//Assuming you have camelCase naming convention enabled
function Customer() {
    this.supplierName = '';
    this.email = '';
}

entityManager.metadataStore.registerEntityTypeCtor('Customer', Customer);
{"Id": 42, "Name": "Customer Name","__unmapped":{"supplierName":"Supplier Name", "email": "supplier@supplier.com"},...}