2014-03-29 90 views
1

我正在设计一个多租户网站,首先使用EF6代码,MVC和其他来自MS堆栈的网站。多租户和EF6设计

我想为每个租户公告。很简单,我的EF代码第一类将是这个样子:

class Announcement 
{ 
    public Announcement() 
    { 
     DateCreated = DateTime.Now; 
    } 

    [Key] 
    public int Id { get; set; } 

    public DateTime DateCreated { get; set; } 

    public string Title { get; set; } 

    public string Message { get; set; } 

    public virtual Tenant Tenant { get; set; } 

    public ApplicationUser Author { get; set; } 
} 

我的设计的问题是什么,如果我想要的网站管理员不得不发布通知到所有租户的能力吗?

由于数据库将强制Tenant关系,因此我无法将Tenant属性设置为虚假。

在EF之前,我会做这样的事情,但现在我会失去很好的EF导航属性。

class Announcement 
{ 
    public Announcement() 
    { 
     DateCreated = DateTime.Now; 
    } 

    [Key] 
    public int Id { get; set; } 

    public DateTime DateCreated { get; set; } 

    public string Title { get; set; } 

    public string Message { get; set; } 

    public int TenantID { get; set; } 

    public ApplicationUser Author { get; set; } 
} 

我会适当地使用TenantID所有基于租客通知,但将其设置为0站点范围内的通知。

那么,有没有更好的设计(除了两个类/表),仍然可以利用EF导航属性?

+1

你为什么选择该模式同出一tenantid问题。你可以将它设置为db中的一个可为空的属性,模型将具有'public int? tenantId {get; set;}' – Saravanan

+0

这是我的问题的基础。我知道我可以使用一个int TenantID字段(可以为空或不可),但是我失去了很好的EF导航属性。 –

+0

我认为在一个多租户应用程序中,您应该为独立于租户的内容分离结构。在这种情况下:单独的“SiteAnnouncement”表。它看起来可能是多余的,但是您应该将租户数据视为单独的数据库。例如,如果将来你想记录哪个租户已经阅读了哪个公告?对于这两种公告来说,情况会大不相同。 –

回答

0

什么是

class Announcement 
{ 
    public Announcement() 
    { 
     DateCreated = DateTime.Now; 
    } 

[Key] 
public virtual int Id { get; set; } 

public virtual DateTime DateCreated { get; set; } 

public virtual string Title { get; set; } 

public virtual string Message { get; set; } 

public virtual int TenantID { get; set; } // during insert/Update set as required. the tenant should exist. 
              // A dummy SYSTEM wide tenant may be an option to consider 

// navigation props 
[ForeignKey("TenantID")] 
public virtual Tenant Tenant { get; set; } // <<<<< NAV as before 

public virtual ApplicationUser Author { get; set; } 
} 
+0

你将如何输入系统范围的公告?在你的班级,我认为只有虚拟租户才能工作。 –

+0

系统范围条目将适用于所有租户。当然,如果你需要租户级别的消息控制。即Tenant X已经读取/接收到该消息,因此不再显示等,然后实际上可能需要为每个租户写一条记录。但你的设计不是我。我只是指出那里有NAV。而且NAV这个类别也没有像预期的那样得到相当的宣布。 –