- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个 Multi-Tenancy 应用程序。几乎所有表都有“AccountId”来指定哪个租户拥有该记录。我有一张表,其中包含所有租户都可以访问的“供应商”列表,但它没有 AccountId。
一些租户希望将自定义字段添加到供应商记录中。
如何在 Code First Entity Framework 中进行设置?到目前为止,这是我的解决方案,但我必须获取所有最喜欢的供应商,因为我无法在 EF 中编写子查询,然后当我更新记录时,就会发生删除。
public class Vendor
{
public int Id { get;set;}
public string Name { get; set; }
}
public class TenantVendor
{
public int AccountId { get;set;}
public int VendorId{ get;set;}
public string NickName { get; set; }
}
// query
// how do I only get single vendor for tenant?
var vendor = await DbContext.Vendors
.Include(x => x.TenantVendors)
.SingleAsync(x => x.Id == vendorId);
// now filter tenant's favorite vendor
// problem: if I update this record later, it deletes all records != account.Id
vendor.TenantVendors= vendor.FavoriteVendors
.Where(x => x.AccountId == _account.Id)
.ToList();
我知道我需要使用多列外键,但我在设置时遇到问题。
架构应如下所示..
Vendor
Id
FavVendor
VendorId
AccountId
CustomField1
然后我可以查询供应商,获取登录帐户的 FavVendor,然后继续我的快乐之路。
我当前的解决方案为我提供了一个额外的“Vendor_Id”外键,但未正确设置它
这应该可以通过设置“一对一”关系并将外键设置为“供应商 ID”和“帐户 ID”来实现
现在正在尝试在 Entity Framework 中进行此设置...
public class Vendor
{
public int Id { get; set; }
public string Name { get; set; }
public virtual FavVendor FavVendor { get; set; }
}
public class FavVendor
{
public string NickName { get; set; }
[Key, Column(Order = 0)]
public int VendorId { get; set; }
public Vendor Vendor { get; set; }
[Key, Column(Order = 1)]
public int AccountId { get; set; }
public Account Account { get; set; }
}
// query to get data
var dbVendorQuery = dbContext.Vendors
.Include(x => x.FavVendor)
.Where(x => x.FavVendor == null || x.FavVendor.AccountId == _account.Id) ;
// insert record
if (dbVendor.FavVendor == null)
{
dbVendor.FavVendor = new FavVendor()
{
Account = _account,
};
}
dbVendor.FavVendor.NickName = nickName;
dbContext.SaveChanges();
当我尝试在 FavVendor.Vendor 上设置外键时,还收到以下错误
FavVendor_Vendor_Source: : Multiplicity is not valid in Role 'FavVendor_Vendor_Source' in relationship 'FavVendor_Vendor'. Because the Dependent Role properties are not the key properties, the upper bound of the multiplicity of the Dependent Role must be '*'.
最佳答案
EF 自然不支持棘手的问题。 DTO 和投影为您提供所需控制的情况之一。仍然存在纯 EF 解决方案,但必须非常仔细地编程。我将尽力涵盖尽可能多的方面。
让我们从不能做什么开始。
This should be possible by setting up a "one to one" relationship and having the foreign key be "Vendor Id" and "Account Id"
这是不可能的。 物理(商店)关系是一对多
(Vendor
(一个)到FavVendor
(多个) ),尽管特定 AccountId
的逻辑关系是一对一
。但EF只支持物理关系,所以根本没有办法表示逻辑关系,而且逻辑关系是动态的。
简单地说,关系必须是一对多
,就像您最初的设计一样。这是最终的模型:
public class Vendor
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<FavVendor> FavVendors { get; set; }
}
public class FavVendor
{
public string NickName { get; set; }
[Key, Column(Order = 0)]
public int VendorId { get; set; }
public Vendor Vendor { get; set; }
[Key, Column(Order = 1)]
public int AccountId { get; set; }
}
This is my solution so far but I have to fetch all favorite vendors since I can't write a sub-query in EF and then when I update the record, deletes are happening.
上述两个问题都可以通过特殊方式编写代码来解决。
首先,由于惰性和急切加载都不支持过滤,唯一剩下的选项是explicit loading (在文档的显式加载相关实体时应用过滤器部分中进行了描述)或投影并依赖上下文导航属性修复(实际上显式加载就是基于此)。为了避免副作用,必须关闭所涉及实体的延迟加载(我已经通过从导航属性中删除virtual
关键字来做到这一点),并且数据检索应该始终通过新的短期 >DbContext
实例,以消除由我们用来过滤 FavVendors
的相同导航属性修复功能导致的相关数据的无意加载。
话虽如此,以下是一些操作:
检索具有针对特定 AccountId 的已过滤 FavVendors 的供应商:
通过 ID 检索单个供应商:
public static partial class VendorUtils
{
public static Vendor GetVendor(this DbContext db, int vendorId, int accountId)
{
var vendor = db.Set<Vendor>().Single(x => x.Id == vendorId);
db.Entry(vendor).Collection(e => e.FavVendors).Query()
.Where(e => e.AccountId == accountId)
.Load();
return vendor;
}
public static async Task<Vendor> GetVendorAsync(this DbContext db, int vendorId, int accountId)
{
var vendor = await db.Set<Vendor>().SingleAsync(x => x.Id == vendorId);
await db.Entry(vendor).Collection(e => e.FavVendors).Query()
.Where(e => e.AccountId == accountId)
.LoadAsync();
return vendor;
}
}
或者更一般地说,对于供应商查询(已应用过滤、排序、分页等):
public static partial class VendorUtils
{
public static IEnumerable<Vendor> WithFavVendor(this IQueryable<Vendor> vendorQuery, int accountId)
{
var vendors = vendorQuery.ToList();
vendorQuery.SelectMany(v => v.FavVendors)
.Where(fv => fv.AccountId == accountId)
.Load();
return vendors;
}
public static async Task<IEnumerable<Vendor>> WithFavVendorAsync(this IQueryable<Vendor> vendorQuery, int accountId)
{
var vendors = await vendorQuery.ToListAsync();
await vendorQuery.SelectMany(v => v.FavVendors)
.Where(fv => fv.AccountId == accountId)
.LoadAsync();
return vendors;
}
}
从断开连接的实体更新特定 AccountId 的供应商和 FavVendor:
public static partial class VendorUtils
{
public static void UpdateVendor(this DbContext db, Vendor vendor, int accountId)
{
var dbVendor = db.GetVendor(vendor.Id, accountId);
db.Entry(dbVendor).CurrentValues.SetValues(vendor);
var favVendor = vendor.FavVendors.FirstOrDefault(e => e.AccountId == accountId);
var dbFavVendor = dbVendor.FavVendors.FirstOrDefault(e => e.AccountId == accountId);
if (favVendor != null)
{
if (dbFavVendor != null)
db.Entry(dbFavVendor).CurrentValues.SetValues(favVendor);
else
dbVendor.FavVendors.Add(favVendor);
}
else if (dbFavVendor != null)
dbVendor.FavVendors.Remove(dbFavVendor);
db.SaveChanges();
}
}
(对于异步版本,只需在相应的Async
方法上使用await
)
为了防止删除不相关的 FavVendors
,您首先从数据库中加载经过过滤 FavVendors
的 Vendor
,然后根据传递的对象 FavVendors
内容添加新的、更新或删除现有的 FavVendor
记录。
回顾一下,它是可行的,但很难实现和维护(特别是如果您需要在返回一些其他引用 实体的查询中包含
,因为您无法使用典型的 Vendor
和过滤的 FavVendors
>VendorInclude
方法)。您可能会考虑尝试一些 3rd 方软件包,例如 Entity Framework Plus 其查询过滤器和包含查询过滤器功能可以显着简化查询部分。
关于sql-server - Entity Framework Multi-Tenancy 自定义共享表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42672824/
对于我积极维护的客户基于 Web 的 CRM 的分支机构数量不断增加的 Multi-Tenancy ,我需要做出一个艰难的数据库设计决策。 我很早就决定为每个分支使用具有单独数据库的单独应用程序,因为
在 Spring 3 应用程序中,我试图通过 Hibernate 4 的原生 MultiTenantConnectionProvider 实现 Multi-Tenancy 。和 CurrentTena
在neo4j中实现 Multi-Tenancy 的最佳方法是什么? 我看过 Tinkerpop 和 Spring Data。 我有多个客户端,我想将客户端信息存储在自己的数据库中以确保安全。 我不想使
我正在一个小团队工作,设计一个流程管理系统,供同一行业内的几个不同客户使用。系统的目标和客户的高水平要求非常相似。然而,正如预期的那样——一旦我们开始深入挖掘他们的个人需求,我们最终会为每个客户进行一
我们正在开发一个“中间层”来替换现有的业务逻辑/数据访问层。我们面临的设计问题之一是,我们需要以一种允许多个客户的数据库和/或中间层部件作为我们托管产品的一部分存在于同一服务器上的方式进行设计。托管环
我有一个非常简单的项目,其中包含一个具有以下 models.py 的应用程序: class UserAccount: user = models.OneToOneField(User)
在我的应用程序中,我想为不同的客户实现 Multi-Tenancy 支持。 我有一个节点树,希望为不同的客户实现私有(private)树的支持。 Neo4j 是否支持 Multi-Tenancy ,或
我似乎找不到任何关于具有多个数据库的 Grails Multitenancy(每个租户一个)的更新资源/指南、插件或示例。我目前被困在 https://grails.org/plugin/multi-
在我的 Laravel 项目中,我使用了 Multi-Tenancy 。对于项目相关的工作,我正在创建一个 laravel 自定义 artisan 命令。我正在尝试在我正在创建的那个 artisan
我想实现 OKTA API 来管理 Multi-Tenancy 环境中的身份验证和 SSO。 每个用户都应该链接到一个租户,并且每个租户都应该配置身份验证策略。有没有办法实现这一目标? 最佳答案 Ok
我在网上阅读了几篇关于 Multi-Tenancy (针对 SaaS 应用程序中的不同客户)的文章(即 this 和 that 和 that)。一旦您决定采用基于鉴别器的方法,hibernate do
我有几个客户端使用的数据库。我真的不希望代理增量键值在客户端之间流血。我希望编号从1开始,并且要针对客户。 我将使用tenant_id的两部分组合键以及增量ID。 为每个租户创建增量 key 的最佳方
我正在开发一个定制的CRM解决方案,该解决方案将通过Web/SaaS模型出售。我预计会有数十或数百个客户使用此解决方案。我将使用MS SQL作为数据库引擎。 选项1是拥有一个数据库,并在表上包括一个T
我开始设计 Multi-Tenancy 系统并且已经阅读了这篇文章: http://msdn.microsoft.com/en-us/library/aa479086.aspx 无论如何,我有几个与身
我正在考虑在 Multi-Tenancy 应用程序中使用 Solr,我想知道是否有任何最佳实践或需要注意的事项? 一个特别的问题是每个租户拥有一个 Solr Core 是否有意义。有大量的 Solr
由于我对 redis 还很陌生,因此我正在尝试探索各种选项,看看如何使用 redis 实现 Multi-Tenancy 。 我在 redisLabs 官方页面上阅读了一些文档,看起来 redis 集群
我们有一个应用程序,可以在 Multi-Tenancy 工作区的服务器上执行大量数据繁重的工作。 以下是它所做的事情: 它从不同文件格式的文件加载数据。 根据定义的逻辑执行幂等规则。 执行处理逻辑,例
我们有一个 Multi-Tenancy Azure 广告应用程序,该应用程序在某些其他租户中不可见。是否有允许第三方应用程序的租户级别设置? 我们从 azure cli 运行以下命令来查看 hte 应
我尝试登录 Azure AD Web 应用程序,当我使用租户内的用户登录时,就可以了,但是当登录其他用户时我得到 AADSTS50020:来自身份提供商“live.com”的用户帐户“********
我正在将 Firebase 视为 MVP Multi-Tenancy 应用的后端。该应用程序将为每个租户提供完全白标,每个租户都注册自己的用户群。肯定会有交叉,用户可以注册多个租户,但是我似乎看不到
我是一名优秀的程序员,十分优秀!