如何使用sqlite数据库正确实现WebAPI Web服务器?

时间:2017-03-07 19:25:29

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

所以,我一直在玩EF和Sqlite。我已经设法在我的开发环境中让他们成功地从数据库读取和写入“Hello world”。我正在使用我所说的Entity框架和sqlite实体框架提供程序。

我读到EF需要在单线程环境中运行。这完全让我困惑,因为根据我的理解,网络应用程序并行处理多个请求。如何才能希望在Web服务器中使用需要单线程的实用程序?

如果重要的话,这里是我用来玩连接的控制台应用程序 - 它也代表了我目前与EF的总结经验

class Program
{
    static void Main(string[] args)
    {
        using (var context = new SessionContext("SessionTables.sqlite"))
        {
            var session = new Session()
            {
                SessionID = Guid.NewGuid().ToString("B"),
                Domain = "NA",
                Username = "Sidney",
                Start = DateTime.UtcNow,
            };
            context.Sessions.Add(session);

            var action = new UserAction()
            {
                ActionDescription = "Tested Entity Framework",
                OccurredAt = DateTime.UtcNow,
            };
            session.Actions = new List<UserAction>();
            session.Actions.Add(action);
            context.SaveChanges();
        }
    }
}

public class Session
{
    public string SessionID { get; set; }
    public string Domain { get; set; }
    public string Username { get; set; }
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
    public virtual ICollection<UserAction> Actions { get; set; }
}

public class UserAction
{
    public int UserActionID { get; set; }
    public string ActionDescription { get; set; }
    public DateTime OccurredAt { get; set; }
    public Guid SessionID { get; set; }
    public virtual Session Session { get; set; }
}

class SessionContext : DbContext
{
    public SessionContext(string filename)
        : base(new SQLiteConnection()
        {
            ConnectionString = new SQLiteConnectionStringBuilder()
            {
                DataSource = filename, ForeignKeys = true
            }
        .ConnectionString
        }, true)
    { /**/ }

    public DbSet<Session> Sessions { get; set; }
    public DbSet<UserAction> Actions { get; set; }
}

1 个答案:

答案 0 :(得分:2)

那应该不是问题。来自NuGet的Microsoft.Data.Sqlite包含一个使用SQLITE_THREADSAFE = 1(序列化)编译的SQLite版本。

尽管如此,EF似乎没有任何问题会让人觉得应用程序应该是&#34;单线程&#34;。

请阅读本文档,解释您使用SQLite的唯一限制。正如文件所说:

  

使用SQLite提供程序时,您有许多限制   应该知道。其中大部分是由于局限性的结果   基础SQLite数据库引擎,并非特定于EF。

https://docs.microsoft.com/en-us/ef/core/providers/sqlite/limitations