我们处于混合环境中,我们的应用程序使用ADO.NET和Entity Framework.
由于两者都指向相同的物理SQL服务器,我们希望从配置文件中删除Entity Framework连接字符串,然后根据当前的ADO.NET连接字符串自动构建字符串.
这样可以避免开发人员更改ADO.NET字符串但忘记更改Entity Framework连接字符串的错误.
我读过这篇文章,但他们没有回答这个问题.
如何以编程方式在Entity Framework 6中为MS SQL创建连接字符串?
如果我创建自己的DbConnection并将其传递给DbContext(existingConnection,contextOwnsConnection),则会抛出错误"在Code First模式下使用上下文,其中包含从EDMX文件生成的用于Database First或Model First开发的代码. "
我没有使用Code First.
https://msdn.microsoft.com/en-us/data/jj680699
这里谈到了EF 6中的代码库配置,但文章没有显示任何实际更改连接字符串的代码.
更新:更多信息,以帮助澄清我的问题.
我不是先使用代码,而是想在配置文件之外构建一个连接字符串.
我正在使用的DbContext是T4模板生成的自动生成的DbContext文件的部分类.
我的印象是我需要创建一个继承的DbConfiguration类并在该类中执行某些操作,但我找到的唯一示例是使用Azure.
https://msdn.microsoft.com/en-us/data/jj680699
有一篇关于Code Project的文章讨论了在运行时设置连接字符串,但本文基于每次创建新实体时构建连接字符串容器.
http://www.codeproject.com/Tips/234677/Set-the-connection-string-for-Entity-Framework-at
我希望能够使用我的部分DbContext类来创建连接字符串,以便调用者不必执行任何特殊操作.
更新:RunTime的工作代码但不是DesignTime
使用由@Circular Reference"下面列出的"发布的代码,我能够更改连接字符串而不更改对我的Entity类的调用但是这对DesignTime EDMX文件不起作用.
public partial class TestEntities : DbContext
{
public TestEntities() : base(GetSqlConnection(), true)
{
}
public static DbConnection GetSqlConnection()
{
// Initialize the EntityConnectionStringBuilder.
EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
var connectionSettings = ConfigurationManager.ConnectionStrings("Current_ADO_Connection_In_Config");
// Set the provider name.
entityBuilder.Provider = connectionSettings.ProviderName;
// Set the provider-specific connection string. …Run Code Online (Sandbox Code Playgroud) 我希望能够修改控制器内的过滤器,然后根据更改的过滤器返回数据.
因此,我在服务器端有一个ODataQueryOptions参数,我可以用它来查看FilterQueryOption.
我们假设过滤器类似于"$ filter = ID eq -1",但在服务器端,如果我看到ID为"-1",则告诉我用户想要选择所有记录.
我试图将"$ filter = ID eq -1"更改为"$ filter = ID ne -1",这将通过设置Filter.RawValue给我所有,但这是只读的.
我试图创建一个新的FilterQueryOption,但这需要一个ODataQueryContext和一个ODataQueryOptionParser,我无法弄清楚如何创建.
然后我尝试设置Filter = Null,然后设置ApplyTo,当我在控制器中设置断点并在立即窗口上检查时,它似乎有效但是一旦它在控制器上离开GET方法,它就会"恢复"回来到URL中传递的内容.
本文讨论了做一些非常相似的" 修改WebAPI OData QueryOptions.Filter的最佳方法 ",但是一旦它离开控制器GET方法,它就会恢复到URL查询过滤器.
使用示例代码更新
[EnableQuery]
[HttpGet]
public IQueryable<Product> GetProducts(ODataQueryOptions<Product> queryOptions)
{
if (queryOptions.Filter != null)
{
var url = queryOptions.Request.RequestUri.AbsoluteUri;
string filter = queryOptions.Filter.RawValue;
url = url.Replace("$filter=ID%20eq%201", "$filter=ID%20eq%202");
var req = new HttpRequestMessage(HttpMethod.Get, url);
queryOptions = new ODataQueryOptions<Product>(queryOptions.Context, req);
}
IQueryable query = queryOptions.ApplyTo(db.Products.AsQueryable());
return query as IQueryable<Product>;
}
Run Code Online (Sandbox Code Playgroud)
运行此代码不会返回任何产品,因为URL中的原始查询需要产品1,我将产品1的ID过滤器与产品2交换.
现在,如果我运行SQL事件探查器,我可以看到它添加了类似"选择"的内容*来自产品WHERE ID = 1 AND …
需要一个关于如何将原始类型集合传递给未绑定函数/或操作以及如何返回原始类型集合的示例。
例如整数列表或数组。
这是一个简单的例子。
List<int> GetEvenNumbers(List<int> numbers)
{
// loop through numbers collection and return a list of the even numbers
}
Run Code Online (Sandbox Code Playgroud)
以下站点讨论使用函数/动作,但不解释传递/接收集合。
https://aspnet.codeplex.com/sourcecontrol/latest#Samples/WebApi/OData/v4/
我什至在“Show Me How With Code”上发布了一个建议,但没有收到回复。
http://aspnet.uservoice.com/forums/228522-show-me-how-with-code/suggestions/6264729-odata-v4-passing-collection-as-parameter-to-unbou
这是我拥有的一些代码,但它似乎不起作用。
// in the controller
[HttpGet]
[ODataRoute("GetEvenNumbers(numbers={numbers})")]
public IHttpActionResult GetEvenNumbers(List<int> numbers)
{
List<int> evenNumbers = new List<int>();
foreach (var number in numbers)
{
if (number % 2 == 0)
{
evenNumbers.Add(number);
}
}
return Ok(evenNumbers);
}
// in the WebApiConfig
var testCollectionFunction = builder.Function("GetEvenNumbers");
testCollectionFunction.CollectionParameter<int>("numbers");
testCollectionFunction.ReturnsCollection<int>();
Run Code Online (Sandbox Code Playgroud)
在 WCF 中这很简单,但在 OData …
我正在使用EF 6.1与.NET 4.6.1.
如果我TransactionScopeAsync在 dbContext 上的 using 块内创建事务范围,然后直接更新数据库中的数据dbContext.Database.ExecuteSqlCommand,然后使用同一事务范围内的查询从数据库调用相同的实体LINQ,则它将不会显示更新的数据。
例子:
using (MyDbContext dbContext = new MyDbContext())
{
using (TransactionScope txScope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
dbContext.Database.ExecuteSqlCommand("UPDATE TestTable SET TestText = 'A' WHERE ID = 1;");
var testObject_A = (from t in dbContext.TestTable where ID == 1 select t.TestText).FirstOrDefault();
// THIS WILL HAVE "A"
dbContext.Database.ExecuteSqlCommand("UPDATE TestTable SET TestText = 'B' WHERE ID = 1;");
var testObject_B = (from t in dbContext.TestTable where ID …Run Code Online (Sandbox Code Playgroud) 我目前有一个 OData V4 服务,它具有以下模型。
“类别”——“代码”
对于每个类别,可以有许多代码。
我需要 $expand the Codes, $filter where Active = true 然后 $orderby Codes.Description。
目前,以下无需订购即可正常工作。
odata/Categories?$expand=Codes($filter=Active eq true)
这不起作用。
odata/Categories?$expand=Codes($filter=Active eq true&$orderby=Description)
我收到“URI 中指定的查询无效。位置 12 处的语法错误。” &“'描述)'中位置 12 处的语法错误。”
基本上它将“描述”之后的最后一个“)”作为错误读取。
有谁知道如何在OData V4的metatdata中设置/读取基于词汇的注释来定义最大字符串长度之类的内容?
有一篇文章“ 客户端注释支持”,但没有显示任何示例代码,我不确定100%是否他们甚至在谈论数据注释。
它具有如下代码:
var person = dsc.People.ByKey("russellwhyte").GetValue();
// Try to get an annotation for a property
dsc.TryGetAnnotation<Func<ObservableCollection<string>>, string>(() => person.Emails, fullQualifiedTermName, qualifier, out annotation);
Run Code Online (Sandbox Code Playgroud)
但是它没有解释“ fullQualifiedTermName”或“ qualifier”使用什么。
我添加了“ odata.inculde-annotations = *”,但这似乎无济于事。
我也尝试了以下方法。
dsc.TryGetAnnotation<Func<string>, string>(() => person.FirstName, "System.ComponentModel.DataAnnotations", out annotation);
Run Code Online (Sandbox Code Playgroud)
但这只会返回null。
我从2012年开始在WCF数据服务中找到了“ 词汇表”,其中谈到了对验证元数据的支持。
我要试一下。
我希望在OData V4中有一种简单/更好的方法可以做到这一点。
Update 1
WCF词汇表示例在OData V4中不起作用,因为System.Web.Http.HttpConfiguration中缺少config.AnnotationsBuilder。
OData V4支持此处http://www.odata.org/vocabularies/所定义的词汇表,甚至还提供了我需要的“元数据注释可以为特定属性定义有效值范围”,但是似乎没有任何示例代码除了SAP https://blogs.sap.com/2013/10/07/vocabulary-based-annotations/之外的任何其他文章。
更新2
在查看TripPinService之后,我注意到它们在预算上有一些注释,如下所示。
<Property Name="Budget" Type="Edm.Single" Nullable="false">
<Annotation Term="Org.OData.Measures.V1.ISOCurrency" String="USD"/>
<Annotation Term="Org.OData.Measures.V1.Scale" Int="2"/>
</Property>
Run Code Online (Sandbox Code Playgroud)
幸运的是,该项目的源代码是ODataSamples TripPin。
在查看了服务之后,我发现我首先必须创建自己的xml词汇表文件。(ValidationVocabularies.xml) …
wcf-data-services odata data-annotations asp.net-web-api2 odata-v4
似乎无法将包含布尔属性的动态列表反序列化为布尔值.
我有以下json.
[
{
"Field1": 1,
"Field2": "Test 1",
"Field3": true
},
{
"Field1": 2,
"Field2": "Test 2",
"Field3": false
}
]
Run Code Online (Sandbox Code Playgroud)
我用的时候:
Newtonsoft.Json.JsonConvert.DeserializeObject<List<dynamic>>(jsonString)
Run Code Online (Sandbox Code Playgroud)
我得到Field3 ="True"或"False"
当绑定到网格或其他控件时,它认为这是一个"字符串"而不是"布尔".
有什么建议?
有谁知道如何在.NET服务中托管OData v4以使用多个路由?
我有以下内容:
config.MapODataServiceRoute("test1", "test1", GetEdmModelTest1());
config.MapODataServiceRoute("test2", "test2", GetEdmModelTest2());
Run Code Online (Sandbox Code Playgroud)
每个GetEdmModel方法都有映射对象.
我可以按照以下方式访问该服务(这很好):
http://testing.com/test1/objects1()
http://testing.com/test2/objects2()
但是,如果我尝试调用以下函数(将无法工作):
[HttpGet]
[ODataRoute("test1/TestFunction1()")]
public int TestFunction1()
{ return 1; }
Run Code Online (Sandbox Code Playgroud)
它会抛出以下错误:
在控制器"测试"动作"TestFunction1"的路径模板"TEST1/TestFunction1()"不是一个有效的OData路径模板.找不到段'test1'的资源.
然而,如果我删除"MapODataServiceRoute"为"测试2",所以只有一个路由,它所有的作品.
如何使用多个路由?
**我已在以下**发布了该问题的完整示例**
https://github.com/OData/WebApi/issues/1223
**我已经尝试了下面列出的OData版本示例以及以下问题**
https://github.com/OData/ODataSamples/tree/master/WebApi/v4/ODataVersioningSample
我之前尝试过"OData版本"示例不工作.似乎未绑定(未绑定是目标)不遵循相同的路由规则是正常的服务调用.
防爆.如果您下载"OData版本"示例并执行以下操作.
builder.Function(nameof(Controller.ProductsV1Controller.Test)).Returns<string>(); builder.Function(nameof(Controller.ProductsV2Controller.Test)).Returns<string>(); [HttpGet]
[ODataRoute("Test()")]
public string Test()
{ return "V1_Test"; }[HttpGet]
[ODataRoute("Test()")]
public string Test()
{ return "V2_Test"; } 现在打电话给它."/ versionbyroute/v1/Test()"你会得到"V2_Test"
问题是"GetControllerName"在使用未绑定的函数/操作时不知道如何获取控制器.
这就是我尝试"推断"控制器时发现的大多数示例代码失败的原因.
我从Visual Studio 2013创建了一个全新的Web表单应用程序,并在web.config文件中设置以下内容:
<authentication mode="Forms">
<forms defaultUrl="~/Home.aspx" loginUrl="~/Login.aspx"
slidingExpiration="true" timeout="2880" />
</authentication>
<authorization>
<deny users="?" />
</authorization>
Run Code Online (Sandbox Code Playgroud)
当我运行该项目时,我得到404.15错误.
这不是MVC网站.
我发现了一个类似的错误,说我需要删除"拒绝用户",但我不想那样做.
如果未经过身份验证,我需要将所有用户定向到登录页面.
*新的Asp.Net MVC5项目产生无限循环登录页面*
我也试过这个但是我得到"这个网页有一个重定向循环"
*如何配置web.config以允许任意长度的请求*
编辑:添加更多链接解释问题.
所以我找到了关于登录页面循环的文章.
*http://erlend.oftedal.no/blog/?blogid=55*
因此,如果我在ProcessRequest上添加一个断点,我可以看到有一个无限循环调用Login.aspx页面.
所以问题似乎不是URL太长,而是有一个无限循环调用Login.aspx页面.
如果我在Login.aspx页面的Page_Load上放置一个断点,断点永远不会被击中.
必须有更高的东西导致重定向.
我需要使用Asp.Net Identity找到所有不包含某个角色的用户.
到目前为止,我有类似的东西,但它不起作用.
(From role In context.Roles
From userRoles In role.Users
Join us In context.Users On us.Id Equals userRoles.UserId
Where role.Name <> "SomeRole"
Select us.UserName)
Run Code Online (Sandbox Code Playgroud)
这给了我一个所有用户的列表,但它包括角色"SomeRole"的用户.
它看起来我需要一些不在子查询中的类型?
这是可行的SQL代码,但如果可能的话,我仍然会喜欢LINQ查询.
select distinct A.UserName from AspNetUsers A
inner join AspNetUserRoles UR on UR.UserId = A.Id
inner join AspNetRoles R on R.Id = UR.RoleId
where not exists(
select AspNetUserRoles UR1 on UR1.UserId = A.Id
inner join AspNetRoles R1 on R1.Id = UR1.RoleId
where R1.Name = 'SomeRole')
Run Code Online (Sandbox Code Playgroud)
嗯,我有一个有效的解决方案,但它不漂亮,我相信它可以写得更好.
(From role In context.Roles
From userRole In …Run Code Online (Sandbox Code Playgroud) 我想对一个实现IEnumerable的VB类进行排序.我不想要一个新对象/ linq.它必须保留为原始对象但已排序.这是一个示例类.
Public Class Person
Public Sub New(ByVal fName As String, ByVal lName As String)
Me.firstName = fName
Me.lastName = lName
End Sub
Public firstName As String
Public lastName As String
End Class
Public Class People
Implements IEnumerable(Of Person)
Private _people() As Person
Public Sub New(ByVal pArray() As Person)
_people = New Person(pArray.Length - 1) {}
Dim i As Integer
For i = 0 To pArray.Length - 1
_people(i) = pArray(i)
Next i
End Sub
Public Function GetEnumerator() As IEnumerator(Of …Run Code Online (Sandbox Code Playgroud) 我有一个 ASP.NET OData 站点,它在 WebApiConfig 文件中包含以下内容:
config.Filters.Add(new AuthorizeAttribute())
Run Code Online (Sandbox Code Playgroud)
这会强制所有调用者在调用任何控制器之前进行身份验证。
不幸的是,这也强制用户身份验证访问“$metadata” url。
我需要对所有控制器访问进行全局强制身份验证,同时还允许匿名访问“$metadata” url。
我有一个字符串,可以结束几个"X"字符.
假设字符串以逗号结尾.
string X = "1,2,3,,,";
Run Code Online (Sandbox Code Playgroud)
我需要一些函数或lambda表达式,可以删除最后一组逗号.
我无法知道字符串末尾有多少逗号,但最终结果应如下所示.
?x -- "1,2,3";
Run Code Online (Sandbox Code Playgroud)