f#SqlDataProvider .Net Core 2.0 - 不支持在环境中登记

时间:2018-02-04 15:12:28

标签: f# .net-core type-providers csqldataprovider

白天,我是C#程序员,但是F#爱好者。

惠斯特做了一些教程(温文尔雅)我偶然发现了这个错误

open System
open FSharp.Data.Sql

[<Literal>]
let ConnectionString = 
    "Data Source=(localdb)\ProjectsV13;Initial Catalog=suavemusicstore;Integrated Security=SSPI;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"

type Sql =
    SqlDataProvider<
        ConnectionString = ConnectionString,
        DatabaseVendor = Common.DatabaseProviderTypes.MSSQLSERVER>

type DbContext = Sql.dataContext
type Album = DbContext.``dbo.AlbumsEntity``
type Genre = DbContext.``dbo.GenresEntity``

let getAlbum id (ctx : DbContext) : Album option =
    query {
        for album in ctx.Dbo.Albums do
        where (album.AlbumId = id)
        select album
    } |> Seq.tryHead

[<EntryPoint>]
let main argv =
    let ctx = Sql.GetDataContext()

    match (getAlbum 2 ctx) with
    | Some(album) -> 
        album.Delete()
        ctx.SubmitUpdates() // EXCEPTION thrown here
        0
    | _ -> 0

然而代码似乎微不足道,我不能相信它不起作用,我们似乎能够从(SQL快速)数据库中读取数据,但不能写入它(或者至少不能删除,我是没试过加)。我真的不知道环境事务是什么,我实际上不关心事务行为我只是想选择一些数据,更新或删除它。

这是所有代码......

    <!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body {margin:0;}

.topnav {
  overflow: hidden;
  background-color: #333;
}

.topnav a {
  float: left;
  display: block;
  color: #f2f2f2;
  text-align: center;
  padding: 14px 16px;
  text-decoration: none;
  font-size: 17px;
}

.topnav a:hover {
  background-color: #ddd;
  color: black;
}

.active {
  background-color: #4CAF50;
  color: white;
}

.topnav .icon {
  display: none;
}

@media screen and (max-width: 600px) {
  .topnav a:not(:first-child) {display: none;}
  .topnav a.icon {
    float: right;
    display: block;
  }
}

@media screen and (max-width: 600px) {
  .topnav.responsive {position: relative;}
  .topnav.responsive .icon {
    position: absolute;
    right: 0;
    top: 0;
  }
  .topnav.responsive a {
    float: none;
    display: block;
    text-align: left;
  }

}
</style>
</head>
<body>

<div class="topnav" id="myTopnav">
  <a href="#home" class="active">Home</a>
  <a href="#news">News</a>
  <a href="#contact">Contact</a>
  <a href="#about">About</a>
  <a href="javascript:void(0);" style="font-size:15px;" class="icon" onclick="myFunction()">&#9776;</a>
</div>

<div style="padding-left:16px">
  <h2>Responsive Topnav Example</h2>
  <p>Resize the browser window to see how it works.</p>
</div>

<script>
function myFunction() {
    var x = document.getElementById("myTopnav");
    if (x.className === "topnav") {
        x.className += " responsive";
    } else {
        x.className = "topnav";
    }
}
</script>

</body>
</html>

有解决方法吗?这是我第一次使用类型提供程序和核心,但似乎你不能编写一个简单的CRUD应用程序。

这个HAS已在其他地方报道过,主要是在C#EF应用程序中,我认为有更多的空间可以解决这个问题(可能)。

任何想法如何解决它?我尝试升级/降级各种金块包,但无济于事

2 个答案:

答案 0 :(得分:1)

我的玩具F#项目很久以前就遇到了同样的问题。我没有找到任何适当的解决方案,最终完全无视交易。这并没有解决潜在的问题,但对我来说这已经足够了(该项目主要用于学习目的)。

let TransactionOptions = {IsolationLevel = IsolationLevel.DontCreateTransaction; Timeout = TimeSpan.FromSeconds(1.0)}

let dbContext = Sql.GetDataContext(TransactionOptions)

答案 1 :(得分:0)

我不知道上述是否有效,但似乎是一种合理的解决方法。 我修复了我的问题,但是恢复到基于框架的控制台应用程序模板而不是核心模板。