如何使用其他应用程序中的数据库?

时间:2016-06-27 23:24:47

标签: c# asp.net-mvc entity-framework

我开始问这个问题,因为我不仅知道怎么做,而且我不知道如何搜索网页以获得某种澄清。

我有一个使用MVC5,实体框架和Code First创建的Web应用程序,我使用网格(jsgrid)。在这个应用程序中,用户登录后,他们可以看到创建的应用程序并添加新的应用程序,并且,他们也可以为他们生成许可证(应用程序密钥)。

现在,我们的想法是从dll模块处理许可证生成器和数据库保存(仅限许可证)。

因此,由于数据库是在MVC应用程序中创建的,我如何让dll模块检入该数据库,以确保应用程序没有该密钥,然后将其保存到数据库中?

(所有这些代码都来自MVC应用程序)

的DbContext:

public class LicenseDataContext : DbContext
    {
        public LicenseDataContext()
            : base("LicenseDataContext")
        {
        }
        public DbSet<Application> Applications { get; set; }
        public DbSet<License> Licenses { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }
    }

LicenseModel

public class License
{
    public int ID { get; set; }
    public string AppName { get; set; }
    public string license { get; set; }
    public string ClientName { get; set; }
    public string ClientEmail { get; set; }
    public Status? Status { get; set; }
    public string CreatedBy { get; set; }
    public string CreationDate { get; set; }
    public string ModifiedBy { get; set; }
    public string ModificationDate { get; set; }
    public SendStatus? SendStatus { get; set; }
    public string SendDate { get; set; }
}

public class LicenseFilter
{
    public string AppName { get; set; }
    public string license { get; set; }
    public string ClientName { get; set; }
    public string ClientEmail { get; set; }
    public Status? Status { get; set; }
    public string CreatedBy { get; set; }
    public string CreationDate { get; set; }
    public string ModifiedBy { get; set; }
    public string ModificationDate { get; set; }
    public SendStatus? SendStatus { get; set; }
    public string SendDate { get; set; }
}

}

LicenseController

public class LicenseDataController : ApiController
{
    MailAddress addr;

    LicenseDataContext _db = new LicenseDataContext();

    LicenseDataContext DB
    {
        get { return _db; }
    }

    public IEnumerable<object> Get()
    {
        LicenseFilter filter = GetFilter();

        var result = DB.Licenses.Where(c => c.AppName == LicenseManagerController._appName &&
            (String.IsNullOrEmpty(filter.AppName) || c.AppName.Contains(filter.AppName)) &&
            (String.IsNullOrEmpty(filter.license) || c.license.Contains(filter.license)) &&
            (String.IsNullOrEmpty(filter.ClientName) || c.ClientName.Contains(filter.ClientName)) &&
            (String.IsNullOrEmpty(filter.ClientEmail) || c.ClientEmail.Contains(filter.ClientEmail)) &&
            (!filter.Status.HasValue || c.Status == filter.Status)
            && (String.IsNullOrEmpty(filter.CreatedBy) || c.CreatedBy.Contains(filter.CreatedBy)) &&
            (String.IsNullOrEmpty(filter.CreationDate) || c.CreationDate.Contains(filter.CreationDate)) &&
            (String.IsNullOrEmpty(filter.ModifiedBy) || c.ModifiedBy.Contains(filter.ModifiedBy)) &&
            (String.IsNullOrEmpty(filter.ModificationDate) || c.ModificationDate.Contains(filter.ModificationDate)) &&
            (!filter.SendStatus.HasValue || c.SendStatus == filter.SendStatus) &&
            (String.IsNullOrEmpty(filter.SendDate) || c.SendDate.Contains(filter.SendDate))
        );

        return result.ToArray();
    }

    private LicenseFilter GetFilter()
    {
        NameValueCollection filter = HttpUtility.ParseQueryString(Request.RequestUri.Query);

        return new LicenseFilter
        {
            AppName = filter["AppName"],
            license = filter["license"],
            ClientName = filter["ClientName"],
            ClientEmail = filter["ClientEmail"],
            Status = (filter["Status"] == "0") ? (Status?)null : (Status)int.Parse(filter["Status"]),
            CreatedBy = filter["CreatedBy"],
            CreationDate = filter["Date"],
            ModifiedBy = filter["ModifiedBy"],
            ModificationDate = filter["Date"],
            SendStatus = (filter["SendStatus"] == "0") ? (SendStatus?)null : (SendStatus)int.Parse(filter["SendStatus"]),
            SendDate = filter["Date"]
        };
    }

    public void Post([FromBody]License license)
    {
        try
        {
            //Here, I suppose to just call the dll to generate the license and save it, instead of doing this.
                addr = new MailAddress(User.Identity.Name);
                string username = addr.User;
                license.AppName = LicenseManagerController._appName;
                //license.license = license from module;
                license.CreatedBy = username;
                license.CreationDate = DateTime.Today.ToString("dd/MM/yy");
                if (license.SendStatus == SendStatus.Sent)
                {
                    license.SendDate = DateTime.Today.ToString("dd/MM/yy");
                }
                DB.Licenses.Add(license);
                DB.SaveChanges();
            }
            catch (Exception insert)
            {
                Debug.WriteLine(insert.ToString());
            }
        }

有什么想法可以帮助我一点点吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

  

因此,由于数据库是在MVC应用程序中创建的,我如何让dll模块检入该数据库,以确保应用程序没有该密钥,然后将其保存到数据库中?

使用数据库连接字符串定位数据库。这通常在web.config或app.config中指定,具体取决于应用程序的类型。所有对数据库具有物理访问权限的应用程序(包括适当的安全凭证)都可以使用相同的连接字符串来访问同一数据库。

DLL模块不能独立运行。它们被加载到应用程序域(通常是Web应用程序或Windows应用程序)。连接字符串通常在引用和加载DLL的程序的web.config或app.config中提供。

答案 1 :(得分:0)

根据评论,我现在掌握了你想要实现的目标。

使用DLL,如果要访问特定的数据库连接字符串,则可以访问应用程序配置(在您的情况下是web.config)。

1。)在DLL项目中添加对System.Configuration的引用 2.)使用ConfigurationManager.ConnectionStrings Property读取应用程序的配置文件(Windows或Web应用程序)

现在,如果你想要一个动态连接字符串,那么你应该在你的DLL上公开一个接受连接字符串的公共方法。输入可以来自用户或您可能提出的任何来源。

此外,您可以为您的DLL添加配置文件,但由于管理起来太麻烦,为什么不使用引用DLL的应用程序的当前配置文件呢? :)