') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); GitHub - cblx/efcore.dataverse: Extends EF Core SqlServer provider for Dataverse · GitHub
Skip to content
This repository was archived by the owner on Aug 14, 2026. It is now read-only.

Repository files navigation

Cblx.EntityFrameworkCore.Dataverse

Extends SqlServer provider for Dataverse

NuGet VersionNuGet Downloads


publicclassDynamicsContext(DbContextOptions<DynamicsContext>options):DataverseDbContext(options){
...}
services.AddDbContext<DynamicsContext>(options =>options.UseDataverse(dataverse =>dataverse.ClientId(configuration["ClientId"]).ClientSecret(configuration["ClientSecret"]).ResourceUrl(configuration["ResourceUrl"]).Authority(configuration["Authority"]));

Model Configuration

For saving data, this libs needs to know more information about the entities, like the entity set name and the Dataverse navigation property name for relationships.

ToEntitySet

This library overrides SaveChangesAsync and perform a request to $batch Dataverse API endpoint for saving data. To do so, it needs to know the entity set for write operations.

entityBuilder.ToTable("account");entityBuilder.ToEntitySet("accounts");

HasODataBindPropertyName

When the entity has a relationship, the lib needs to know what's the navigation name to update the FK property.

Desired write body:

{
"other_entity@odata.bind": "other_entities(<guid>)",
"etc": "other values"
}

Configuring relationship

entityBuilder.Property(x =>x.OtherEntityId).HasColumnName("other_entity").HasODataBindPropertyName("other_entity");// The lib will infer the entity set configured for the other entityentityBuilder.HasOne(x =>x.OtherEntity).WithMany().HasForeignKey(x =>x.OtherEntityId);

HasForeignEntitySet

This is used when the FK has no correspondent Entity defined in the model:

entityBuilder.Property(x =>x.OtherEntityId).HasColumnName("other_entity").HasODataBindPropertyName("other_entity").HasForeignEntitySet("other_entities");

Many-to-many Dataverse relationship

builder.HasMany(e =>e.Others).WithMany().UsingDataverseManyToManyRelationshipEntity(joinTable:"account_other",rightForeignKey:"otherid",leftForeignKey:"accountid",navigationFromLeft:"account_others");

GetOptionsAsync

Gettinge choice options for a property

db.Entities.GetOptionsAsync(e => e.ChoiceProperty);

About

Extends EF Core SqlServer provider for Dataverse

Resources

Stars

2 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages