Preceding answers show the good way to solve the problem but none works in real life.
Here’s a tested solution with Entity Framework 6
that works for me. So it should works for you.
Import your scalar valued function
Import your scalar valued function [FRM].[GetContentByIdAndCul]
into your Entity Framework model. It automatically creates corresponding entry in the storage model of your EntityModels.edmx
file :
<Function Name="GetContentByIdAndCul" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="FRM" ReturnType="nvarchar(max)">
<Parameter Name="Id" Type="int" Mode="In" />
<Parameter Name="Culture" Type="nvarchar(5)" Mode="In" />
</Function>
Add code to wrap call to your scalar valued function
Create new source file and add code to auto generated DbContext
class (say her name is MyEntities
) using Partial class mechanism (https://msdn.microsoft.com/en-us/library/wa80x488%28v=vs.120%29.aspx)
public partial class MyEntities
{
[DbFunction("EntityModels.Store", "GetContentByIdAndCul")]
public string GetContentByIdAndCul(int id, string culture)
{
var objectContext = ((IObjectContextAdapter)this).ObjectContext;
var parameters = new List<ObjectParameter>();
parameters.Add(new ObjectParameter("Id", id));
parameters.Add(new ObjectParameter("Culture", culture));
return objectContext.CreateQuery<string>("EntityModels.Store.GetContentByIdAndCul(@Id, @Culture)", parameters.ToArray())
.Execute(MergeOption.NoTracking)
.FirstOrDefault();
}
}
Use your scalar valued function
Client code :
using (var context = new MyEntities())
{
int id = 1;
string culture = "fr-FR";
string result = null;
result = context.GetContentByIdAndCul(id, culture);
}
I have a scalar-valued function in my sql database.
I receive this error when importing this function into Entity Framework model:
Error 6046: Unable to generate function import return type of the store function 'GetContentByIdAndCul'.
The store function will be ignored and the function import will not be generated. ..\EntityModels.edmx
my function tsql is:
ALTER FUNCTION [FRM].[GetContentByIdAndCul]
(@Id int,@Culture nvarchar(5))
RETURNS nvarchar(max)
AS
BEGIN
declare @Result nvarchar(max)
if @Id is not null
set @Result='This Content not defined in this Language'
select @Result=Value from CUL.Contents
WHERE ID=@Id AND (CUL.Contents.Culture = LOWER(@Culture)
OR CUL.Contents.Culture = LOWER(SUBSTRING(@Culture,1,2)))
return @Result
END
Preceding answers show the good way to solve the problem but none works in real life.
Here’s a tested solution with Entity Framework 6
that works for me. So it should works for you.
Import your scalar valued function
Import your scalar valued function [FRM].[GetContentByIdAndCul]
into your Entity Framework model. It automatically creates corresponding entry in the storage model of your EntityModels.edmx
file :
<Function Name="GetContentByIdAndCul" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="FRM" ReturnType="nvarchar(max)">
<Parameter Name="Id" Type="int" Mode="In" />
<Parameter Name="Culture" Type="nvarchar(5)" Mode="In" />
</Function>
Add code to wrap call to your scalar valued function
Create new source file and add code to auto generated DbContext
class (say her name is MyEntities
) using Partial class mechanism (https://msdn.microsoft.com/en-us/library/wa80x488%28v=vs.120%29.aspx)
public partial class MyEntities
{
[DbFunction("EntityModels.Store", "GetContentByIdAndCul")]
public string GetContentByIdAndCul(int id, string culture)
{
var objectContext = ((IObjectContextAdapter)this).ObjectContext;
var parameters = new List<ObjectParameter>();
parameters.Add(new ObjectParameter("Id", id));
parameters.Add(new ObjectParameter("Culture", culture));
return objectContext.CreateQuery<string>("EntityModels.Store.GetContentByIdAndCul(@Id, @Culture)", parameters.ToArray())
.Execute(MergeOption.NoTracking)
.FirstOrDefault();
}
}
Use your scalar valued function
Client code :
using (var context = new MyEntities())
{
int id = 1;
string culture = "fr-FR";
string result = null;
result = context.GetContentByIdAndCul(id, culture);
}
EF 6.1.3 до сих пор не генерирует код для скалярных функций. Тем не менее, вы можете расширить свой класс DbContext и добавить свою собственную реализацию в вашу функцию. После этого вы можете вызывать свою функцию как любой другой объект внутри вашей EF-модели.
Создайте файл, содержащий [частичный класс] в том же [пространстве имен], что и ваша модель БД, и с тем же именем контекста модели. И добавьте этот код:
public partial class YourDBContext : DbContext
{
public System.Data.Entity.Core.Objects.ObjectContext AsObjectContext()
{
return (this as System.Data.Entity.Infrastructure.IObjectContextAdapter).ObjectContext;
}
[DbFunction("YourDBModel.Store", "fn_PWDCOMPARE")]
public bool fn_PWDCOMPARE(string pwd, string pwdhash)
{
var paramList = new ObjectParameter[]
{
new ObjectParameter("pwd", pwd),
new ObjectParameter("pwdhash", pwdhash)
};
return this.AsObjectContext().CreateQuery<bool>("YourDBModel.Store.fn_PWDCOMPARE", paramList).Execute(MergeOption.NoTracking).FirstOrDefault();
}
Затем вы просто вызываете эту новую функцию из своего кода:
bool retVal = YourDBContext.fn_PWDCOMPARE (pass, hash);
I have a scalar-valued function in my sql database.
I receive this error when importing this function into Entity Framework model:
Error 6046: Unable to generate function import return type of the store function 'GetContentByIdAndCul'.
The store function will be ignored and the function import will not be generated. ..EntityModels.edmx
my function tsql is:
ALTER FUNCTION [FRM].[GetContentByIdAndCul]
(@Id int,@Culture nvarchar(5))
RETURNS nvarchar(max)
AS
BEGIN
declare @Result nvarchar(max)
if @Id is not null
set @Result='This Content not defined in this Language'
select @Result=Value from CUL.Contents
WHERE [email protected] AND (CUL.Contents.Culture = LOWER(@Culture)
OR CUL.Contents.Culture = LOWER(SUBSTRING(@Culture,1,2)))
return @Result
END
Preceding answers show the good way to solve the problem but none works in real life.
Here’s a tested solution with Entity Framework 6
that works for me. So it should works for you.
Import your scalar valued function
Import your scalar valued function [FRM].[GetContentByIdAndCul]
into your Entity Framework model. It automatically creates corresponding entry in the storage model of your EntityModels.edmx
file :
<Function Name="GetContentByIdAndCul" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="FRM" ReturnType="nvarchar(max)">
<Parameter Name="Id" Type="int" Mode="In" />
<Parameter Name="Culture" Type="nvarchar(5)" Mode="In" />
</Function>
Add code to wrap call to your scalar valued function
Create new source file and add code to auto generated DbContext
class (say her name is MyEntities
) using Partial class mechanism (https://msdn.microsoft.com/en-us/library/wa80x488%28v=vs.120%29.aspx)
public partial class MyEntities
{
[DbFunction("EntityModels.Store", "GetContentByIdAndCul")]
public string GetContentByIdAndCul(int id, string culture)
{
var objectContext = ((IObjectContextAdapter)this).ObjectContext;
var parameters = new List<ObjectParameter>();
parameters.Add(new ObjectParameter("Id", id));
parameters.Add(new ObjectParameter("Culture", culture));
return objectContext.CreateQuery<string>("EntityModels.Store.GetContentByIdAndCul(@Id, @Culture)", parameters.ToArray())
.Execute(MergeOption.NoTracking)
.FirstOrDefault();
}
}
Use your scalar valued function
Client code :
using (var context = new MyEntities())
{
int id = 1;
string culture = "fr-FR";
string result = null;
result = context.GetContentByIdAndCul(id, culture);
}
Hello,
For the scalar UDF, unfortunately, it is not supported by default even in Entity Framework 6 or 6.1.
One way to use it in Entity Framework is to create a stored procedure using your scalar UDF and call the stored procedure in your project.
Another way is to map it by hand using DbFunctionAttribute to call the function from SSDL directly as:
The class is used to call function from SSDL
public static class EdmFunctions { [DbFunction("DFDBModel.Store", "Function_20140606")] public static int Function_20140606(int param1, int param2) { throw new NotSupportedException("Direct calls are not supported."); } }
Writting an object query pointing to the function:
List<ObjectParameter> parameters = new List<ObjectParameter>(3); parameters.Add(new ObjectParameter("param1", 1)); parameters.Add(new ObjectParameter("param2", 1)); var output = ((IObjectContextAdapter)db).ObjectContext.CreateQuery<int>("DFDBModel.Store.Function_20140606(@param1, @param2)", parameters.ToArray()) .Execute(MergeOption.NoTracking) .FirstOrDefault();
The function is created by default:
CREATE FUNCTION [dbo].[Function_20140606] ( @param1 int, @param2 int ) RETURNS INT AS BEGIN RETURN @param1 + @param2 END
Regards.
We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
Click
HERE to participate the survey.
-
Marked as answer by
Friday, August 15, 2014 7:18 AM
Я хочу добавить еще несколько аннотаций аннотации проверки для моделей (все модели здесь сначала генерируются базой данных), поэтому я использовал метаданные с помощью этой ссылки https://docs.microsoft.com/en-us/aspnet/mvc/overview/get-started/database-first-development/повышение-валидация данных. Никакие модели не обновляются, но строят сбои и вместо этого отображается предупреждение:
Ошибка 6046: Невозможно сгенерировать функцию возврата типа импорта функции сохранения «fn_diagramobjects».
Ошибка CS1061 «Учетная запись» не содержит определения для «ConfirmPassword», и не может быть найден метод расширения «ConfirmPassword», принимающий первый аргумент типа «Учетная запись» (вам не хватает директивы using или ссылки на сборку?) Project-asp- mvc D:.NET demoProjectproject-asp-mvcControllersUserController.cs 85 Active
Это моя модель, сгенерированная из базы данных:
using System;
using System.Collections.Generic;
public partial class Account
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Account()
{
this.Orders = new HashSet<Order>();
}
public string username { get; set; }
public string password { get; set; }
public Nullable<int> role_id { get; set; }
public virtual Role Role { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Order> Orders { get; set; }
}
Metadata.cs:
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Web;
namespace project_asp_mvc.Models
{
public class AccountMetadata
{
[Required]
[StringLength(50, ErrorMessage = "Username con not be longer than 50")]
[EmailAddress]
public string username { get; set; }
[Required]
[DataType(DataType.Password)]
public string password { get; set; }
[Required]
[NotMapped]
[DataType(DataType.Password)]
[Compare("Password", ErrorMessage = "Please confirm your password again")]
public string ConfirmPassword { get; set; }
}
}
PartialClasses.cs
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
namespace project_asp_mvc.Models
{
[MetadataType(typeof(AccountMetadata))]
public partial class Account
{
}
}
0 / 0 / 1 Регистрация: 05.04.2016 Сообщений: 134 |
|
1 |
|
02.12.2018, 16:45. Показов 5637. Ответов 10
Скачал и установил Visual Studio, и решил значит, проверить как он работает. Я написал обычный Hello world но не могу никак его скомпилировать, выдается ошибка: Visual Studio обнаружена непредвиденная ошибка. Как ее исправить? 0 |
112 / 91 / 31 Регистрация: 24.10.2018 Сообщений: 336 |
|
02.12.2018, 16:54 |
2 |
У тебя в солюшне отсутствует какой-либо проект. Это нонсенс. Пересоздай решение по-нормальному с проектом, или добавь в существующее решение проект. И хватит давать файлам имена с пробелами, это жуть. 0 |
0 / 0 / 1 Регистрация: 05.04.2016 Сообщений: 134 |
|
02.12.2018, 17:03 [ТС] |
3 |
какой еще солюшник? Что это? И что плохого в именах с пробелами? Так читабельнее Добавлено через 7 минут 0 |
112 / 91 / 31 Регистрация: 24.10.2018 Сообщений: 336 |
|
02.12.2018, 17:07 |
4 |
Написано же что «проектов: 0» в решении. Сорец, который ты редактируешь вообще никак не связан с открытым решением.
какой еще солюшник? По-русски — это идиотское слово «решение». Добавлено через 14 секунд
И что плохого в именах с пробелами? В них плохо — все. 0 |
0 / 0 / 1 Регистрация: 05.04.2016 Сообщений: 134 |
|
02.12.2018, 17:13 [ТС] |
5 |
Ладно, с этим разобрался, но есть еще вопросы. Что за #include «pch.h» ? раньше я такого не видел. 0 |
0 / 0 / 1 Регистрация: 05.04.2016 Сообщений: 134 |
|
02.12.2018, 17:35 [ТС] |
6 |
Теперь и компилятор исчез 0 |
112 / 91 / 31 Регистрация: 24.10.2018 Сообщений: 336 |
|
02.12.2018, 17:44 |
7 |
Ладно, с этим разобрался, но есть еще вопросы. Что за #include «pch.h» ? Это pre-compiled headers заголовок. Это отличный пример минуса использования IDE для обучения программированию. Так как вместо просто обучения в банальном редакторе с компилятором, внимание на себя обращает всякий мусор добавляемый IDE. Забей на этот инклуд.
И еще cout:необъявленный идентификатор — что? но я же написал #include <iostream>! Почитай про namespace’ы. В частности про std. Добавлено через 29 секунд
Теперь и компилятор исчез Не вижу ничего исчезнувшего. 0 |
0 / 0 / 1 Регистрация: 05.04.2016 Сообщений: 134 |
|
02.12.2018, 17:52 [ТС] |
8 |
Исчезла кнопка «Компилировать». Using namespace писал, не помогало, сейчас работает, странно… А как в командную строку то вывести? 0 |
0 / 0 / 1 Регистрация: 05.04.2016 Сообщений: 134 |
|
02.12.2018, 18:00 [ТС] |
9 |
Я про это говорил, когда сказал что исчезло. 0 |
0 / 0 / 1 Регистрация: 05.04.2016 Сообщений: 134 |
|
03.12.2018, 11:08 [ТС] |
10 |
Почему в командную строку не выводит? 0 |
0 / 0 / 1 Регистрация: 05.04.2016 Сообщений: 134 |
|
03.12.2018, 11:30 [ТС] |
11 |
0 |
Пару дней назад установил Visual Studio 2022 на Windows 10 (все обновления). Сегодня создал первый проект, попытался запустить (скомпилировать), но получил десятки ошибок о том, что не удаётся открыть источник файл "имя_файла.h"
(E1696) + другие ошибки. Всего ошибок почти 500.
Список ошибок при попытке компиляции консольного проекта C++: тык.
C# компилируется, не компилируется видимо только C++.
Я открыл проводник в том месте (C:Program FilesMicrosoft Visual Studio2022CommunityVCToolsMSVC14.33.31629include), где оно не может открыть эти «источник файл», и установил, что примерно треть всех файлов не имеют расширения (остальные файлы имеют расширение .h/.hpp).
Hello,
For the scalar UDF, unfortunately, it is not supported by default even in Entity Framework 6 or 6.1.
One way to use it in Entity Framework is to create a stored procedure using your scalar UDF and call the stored procedure in your project.
Another way is to map it by hand using DbFunctionAttribute to call the function from SSDL directly as:
The class is used to call function from SSDL
public static class EdmFunctions { [DbFunction("DFDBModel.Store", "Function_20140606")] public static int Function_20140606(int param1, int param2) { throw new NotSupportedException("Direct calls are not supported."); } }
Writting an object query pointing to the function:
List<ObjectParameter> parameters = new List<ObjectParameter>(3); parameters.Add(new ObjectParameter("param1", 1)); parameters.Add(new ObjectParameter("param2", 1)); var output = ((IObjectContextAdapter)db).ObjectContext.CreateQuery<int>("DFDBModel.Store.Function_20140606(@param1, @param2)", parameters.ToArray()) .Execute(MergeOption.NoTracking) .FirstOrDefault();
The function is created by default:
CREATE FUNCTION [dbo].[Function_20140606] ( @param1 int, @param2 int ) RETURNS INT AS BEGIN RETURN @param1 + @param2 END
Regards.
We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
Click
HERE to participate the survey.
-
Помечено в качестве ответа
15 августа 2014 г. 7:18