如何使用OData.net将具有自定义数据的多对多关系记录插入CRM?

时间:2018-08-15 09:29:56

标签: c# .net odata dynamics-crm

我正在使用OData.net库访问Microsoft Dynamics 365 OData API(v9)。

我们有一个表(CRM实体),该表包含有关另一个实体的语言的信息以及如果该语言是该实体的主要语言的信息。

所以我们有语言ID,实体ID和主要语言的布尔值。

目前,我正在使用以下代码创建CRM记录:

Contact contact = _dao.Get...
Language language = _dao.Get...

// This creates a new entity and adds it to the DataServiceCollection for tracking
Languageconnection conn = _dao.CreateNewEntity<Languageconnection>();

// Calls the AddLink of the generated OData context with the same parameters
_dao.AddLink(contact, nameof(Contact.Contact_languageconnection_contact_id).ToLower(), conn);
_dao.AddLink(language, nameof(Language.Language_languageconnection_language).ToLower(), conn);

conn.Contact_id = contact;
conn.Language_id = language;
conn.Mainlanguage = true;

_dao.SaveChanges(SaveChangesOptions.PostOnlySetProperties);

问题在于Mainlanguage的值没有被发布到CRM,因此该值保持为假。

我不知道OData.net库是否支持我要问的功能,因为该文档非常缺乏。

一种解决方案是首先执行插入操作,获取新记录的GUID,然后再次调用update,但这将变得非常复杂,因为OData上下文正在跟踪所有实体并获取正确实体的ID。似乎很困难。

1 个答案:

答案 0 :(得分:0)

我从未使用过OData.net库,但听起来let obj = {foo:{}, bar:[]} const fooStream = JSONStream.parse(["foo", true]); fooStream.on("data", (data)=>{obj.foo = data;}) const barStream = JSONStream.parse(["bar", true]); barStream.on("data", (data)=>{obj.bar.push(data);}) _some_stream.pipe(fooStream); _some_stream.pipe(barStream); 对象缺少_dao布尔值。

也许会像Mainlanguage这样。

_dao.Add(conn.Mainlanguage);

我记得类似的事情也应该可以工作。

Languageconnection conn = _dao.CreateNewEntity<Languageconnection>();

// Calls the AddLink of the generated OData context with the same parameters
_dao.AddLink(contact, nameof(Contact.Contact_languageconnection_contact_id).ToLower(), conn);
_dao.AddLink(language, nameof(Language.Language_languageconnection_language).ToLower(), conn);

conn.Contact_id = contact;
conn.Language_id = language;
conn.Mainlanguage = true;

_dao.Add(conn.Mainlanguage);

_dao.SaveChanges(SaveChangesOptions.PostOnlySetProperties);