有没有办法在相同的模型和相同的控制器中联接相等的表?

时间:2019-04-17 12:42:50

标签: c# entity-framework asp.net-web-api

我已经完成了一个ASP.NET Web应用程序项目,并从数据库中添加了两个ADO.NET实体数据模型元素及其相应的控制器。

事实是两个数据库都包含相同的表,具有相同的结构,但具有不同的数据。例如,在两个数据库中都有此表:

public partial class User
{
    public long id { get; set; } // Autoincrement
    public string bd { get; set; }
    public string username { get; set; }
    public string password { get; set; }
    public short role { get; set; }
}

只有2个,使用2个Models和2个Controller时的冗余并不是一个大问题,但是现在我想添加更多具有相同特征的数据库(具有相同结构但数据不同的User表)

是否有所有表可以合并并拥有一个Controller的方法?而且,此外,控制器将允许我执行以下操作:

•全部获取:从所有User表获取所有数据

•GET / id / bd:获取在URL中传递的具有id和bd的数据

•POST:在存储在bd属性中的数据库中添加新用户

•PUT / id:使用存储在bd属性中的id和数据库修改数据

3 个答案:

答案 0 :(得分:0)

好吧,如果所有表都相同,那么您不需要多个冗余模型,您只需使用一个即可。这可以解决问题的一方面。

您可以做的另一件事是存储连接字符串列表,为每个字符串分配一个唯一的标识符,然后通过一个控制器访问它们。您只需要在路由中使用一个额外的参数即可指定要使用的数据库。因此,您现在可以使用一种用户模型和一种控制器,以及所需的任何方法,而无需重复实现同一件事。

例如,您的路由可能类似于api / client1 / users。 client1标识符告诉您需要连接到哪个数据库。

当然还有其他考虑因素,例如您可能需要将此暴露给外界。在这种情况下,您可以使用JWT授权系统,则为每个客户端分配一个ClientID,然后根据该ClientID知道要连接到哪个数据库。如果您使用的是这样的系统,则无需在URL中传递任何额外的数据,只需发出令牌,然后添加声明即可说明要使用哪个数据库即可。

答案 1 :(得分:0)

感谢您的回答,但是我已经能够用另一种方式解决它。

我已将不同的数据库存储在Dictionary中,其中Key为数据库的名称,并为动态类型赋值。通过这种方式,我无需调用数据库的对象,而是调用通过请求中的参数传递的,存储在数据库中的Dictionary的动态。这样,我只需向字典中添加一个元素即可添加更多数据库,从而节省了很多冗余代码。

作为更改示例,我向您展示了以前和现在的Get / id / bd方法:

public class UsersController : ApiController
{
    // Before
    private typeDB1 db = new typedb1();
    private typeDB2 db2 = new typedb2();

    [ResponseType(typeof(User))]
    [Route("api/users/{id}/{bdatos}")]
    public IHttpActionResult GetUser(long id, string bdatos)
    {
        try
        {
            if(bdatos == "typeDB1")
            {
                typeDB1.User userdb1 = typeDB1.Find(id);
                if (userdb1 == null)
                {
                    return NotFound();
                }

                return Ok(userdb1);
            }
            else
            {
                typeDB2.User userdb2 = typeDB2.Find(id);
                if (userdb2 == null)
                {
                    return NotFound();
                }

                return Ok(userdb2);
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    // Now
    private typeDB1 db = new typedb1();
    private typeDB2 db2 = new typedb2();

    private Dictionary<string, dynamic> dbDictionary = new Dictionary<string, dynamic>
    {
        ("typeDB1", db),
        ("typeDB2", db2)
    };

    [ResponseType(typeof(User))]
    [Route("api/users/{id}/{bdatos}")]
    public IHttpActionResult GetUser(long id, string bdatos)
    {
        try
        {
            dynamic certificate = dbDictionary[bdatos].Find(id);
            if (certificate == null)
            {
                return NotFound();
            }

            return Ok(certificate);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}

答案 2 :(得分:-1)

您可以使用AutoMapper将User数据模型(来自不同的数据库)映射到控制器中使用的User对象。