小编Mat*_*son的帖子

如何使用带有MVC4的实体框架在多租户应用程序中过滤DbContext

我正在使用MVC4EF5开发一个多租户Web应用程序.我之前曾问过有关过滤我的DbContext的问题:在存储库模式中按ID过滤是不好的做法.

显然,我的方法很合理,但有人建议,不是在单个存储库中处理所有过滤,而是使用'存储库或DBContextWrapper类来提供已经过滤到租户级别上下文,它将为[my]普通存储库提供信息.

不幸的是我不是MVC专家,所以我尽可能地开始实现这一点,但是在研究其他多租户应用程序的EF过滤时,我发现了一个非常类似案例的问题 多租户Web应用程序带有过滤的dbContext,尽管完全失败了理解答案.

在我的应用程序中,CompanyID是User类的属性,因此应直接从经过身份验证的用户获取.例如:

int CompanyID = db.Users.Single(u => u.Email == User.Identity.Name).CompanyID;
Run Code Online (Sandbox Code Playgroud)

我当前的方法似乎确实有效,但是我很确定我已经以错误的方式解决了问题和/或根据我在其他问题中看到的关于做同样事情的事情而做得不够好.在另一个问题中,使用实体框架反射的简单多租户Web应用程序的解决方案用于执行此操作,但我无法确定它是否适用于我的情况,甚至如何使用它.

如果有人能够解释这个问题的最佳方式,以及不同方式的利弊,我将非常感激.谢谢 :)

我目前的实施如下:

D B

  • 一个数据库,多个租户.
  • 所有表都以这种或那种方式链接回公司表,尽管并非所有表都有CompanyID字段.

TestController.cs

public class TestController : Controller
{
    private BookingSystemEntities db = new BookingSystemEntities();
    public ActionResult Index()
    {
        var user = db.Users.Single(u => u.Email == User.Identity.Name);
        IBookingSystemRepository rep = new BookingSystemRepository(db, user);            
        return View(rep.GetAppointments(false));
    }

}
Run Code Online (Sandbox Code Playgroud)

BookingSystemRepository.cs

public class …
Run Code Online (Sandbox Code Playgroud)

c# asp.net entity-framework multi-tenant asp.net-mvc-4

9
推荐指数
1
解决办法
6356
查看次数

在存储库模式中按ID过滤是不好的做法

我正在使用ASP.NET MVC4Entity Framework 5.

基本上每个控制器操作结果都按登录的用户公司ID过滤db结果.我刚刚开始实现一个存储库模式来返回模型,而不是直接从控制器中过滤DbContext.(将companyID传递到存储库以过滤方法的结果)

我有一种有趣的感觉,这样做是不好的做法,但一直无法找到有关该主题的任何信息.我将在下面插入我当前代码的基本版本,我将不胜感激任何关于它是否是不良做法的信息,以及为什么如此.

IBookingSystemRepository.cs

public interface IBookingSystemRepository : IDisposable
{
    IEnumerable<Appointment> GetAppointments();
    IEnumerable<Appointment> GetAppointments(bool includeDeleted);
    IEnumerable<Client> GetClients();
    IEnumerable<Client> GetClients(bool includeDeleted);
    void Save();
}
Run Code Online (Sandbox Code Playgroud)

BookingSystemRepository.cs

public class BookingSystemRepository : IBookingSystemRepository
{
    private BookingSystemEntities db;
    int CompanyID;

    public BookingSystemRepository(BookingSystemEntities context, int companyID)
    {
        this.db = context;
        this.CompanyID = companyID;
    }

    public IEnumerable<Appointment> GetAppointments()
    { return GetAppointments(false); }

    public IEnumerable<Appointment> GetAppointments(bool includeDeleted)
    {
        return includeDeleted
            ? db.Appointments.Where(a => a.User.CompanyID == CompanyID)
            : db.Appointments.Where(a => a.User.CompanyID …
Run Code Online (Sandbox Code Playgroud)

.net c# entity-framework asp.net-mvc-4 entity-framework-5

7
推荐指数
1
解决办法
1307
查看次数

如何配置TinyMCE允许锚标记内的块级元素?

这是我的情况;我希望能够创建如下内容:

<div class="a">
    <a href="someurl"><img src="somepic"></a>
</div>
Run Code Online (Sandbox Code Playgroud)

但是TinyMCE将其剥离为

<div class="a">
    <img src="somepic">
</div>
Run Code Online (Sandbox Code Playgroud)

谢谢!

html javascript html5 wysiwyg tinymce

0
推荐指数
1
解决办法
2359
查看次数

十进制? - Nullable对象必须具有值

我正在使用RazorVS2013中使用VB.NET MVC 5.1

siq.Price是一个十进制?

我正在尝试检查siq.Price是否有值,如果是,则将其打印为货币.我在尝试访问.Value属性时收到此错误,其中true为.HasValue返回true的元素:

可以为空的对象必须具有值.

描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.

异常详细信息:System.InvalidOperationException:Nullable对象必须具有值.

我尝试了这两行代码,认为它们应该没有问题,但收到了上面的错误:

@IIf(siq.Price.HasValue, siq.Price.Value, "N/A")
   'and
@IIf(siq.Price.HasValue, siq.Price.Value.ToString("C"), "N/A")
Run Code Online (Sandbox Code Playgroud)

一旦我从TruePart中删除了.Value,它就开始工作了:

@IIf(siq.Price.HasValue, siq.Price, "N/A")
    'and
@IIf(siq.Price.HasValue, String.Format("{0:C}", siq.Price), "N/A")
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么会这样吗?!我很困惑.

注意:如果Price有值,这段代码就可以自己运行,但是在IIf()中没有:

@siq.Price.Value.ToString("C")
Run Code Online (Sandbox Code Playgroud)

vb.net asp.net-mvc nullable invalidoperationexception razor

0
推荐指数
1
解决办法
581
查看次数