D365 FO 对Duty扩展导致同步数据库失败

同步数据库,报错
 Microsoft.Dynamics.AX.Metadata.Storage.MetadataReadCorruptDataException: Microsoft.Dynamics.AX.Metadata.Storage.MetadataReadCorruptDataException: Error occured while applying extensions for metadata 'SalesQuotationToSalesOrderProcessEnable' of type 'AxSecurityDuty'. ---> Microsoft.Dynamics.AX.Metadata.Core.Exceptions.DuplicateNamedObjectException: Element named: 'TestTableMaintain' of type 'AxSecurityPrivilegeReference' already exists among elements。
报错的原因是对SalesQuotationToSalesOrderProcessEnable这个系统的Duty进行了两次扩展,这个系统是允许的,然后在两次不同的扩展里都包含了TestTableMaintain这个Privilege,这个编译期也是不报错的。
但是同步数据库的时候,权限的设置数据是在数据库相关表里存储的,这样设置违反了数据库的PK约束,于是报错了。
所以扩展系统的权限相关的数据的时候一定要注意,如果一个项目里一定要扩展两次(通常没必要这么做),不要把相同的权限项拖到针对同一个系统对象的不同的扩展里。
同步报错给的建议有点误导人
 Database synchronization failed. You may have to do a full build of the package 'TestSolution' and all of its dependent packages.
它让把model编译一下,其实整个model编译也解决不了这个冲突,唯一的解决办法是,找到提示中报错的Duty,把其中一个扩展里的安全项删掉。
当然正常一个model里应该只会扩展一次,所以很少会遇到这个问题。
按照目前D365 FO的逻辑,针对同一个系统对象做两次扩展,结果都是随机的,在不同扩展同一个类的同一个方法两次,这个是支持的,但是Coc执行的顺序是随机的,结果当然也是随机的。
所以还是避免针对同一个系统对象扩展两次的情况出现。

原文地址:https://www.cnblogs.com/Farseer1215/p/12963297.html