Tôi muốn tích hợp Khuôn khổ thực thể 6 vào hệ thống của chúng tôi, nhưng có vấn đề.Khuôn khổ thực thể 6 Mã Ánh xạ hàm đầu tiên
- Tôi muốn sử dụng Mã đầu tiên. Tôi không muốn sử dụng tệp Database First * .edmx vì các lý do khác.
- Tôi sử dụng ánh xạ thuộc tính [Bảng], [Cột] và công cụ này hoạt động tốt
- Cơ sở dữ liệu có nhiều hàm do người dùng xác định và tôi cần sử dụng chúng trong truy vấn LINQ to Entities.
Vấn đề là:
tôi không thể ánh xạ chức năng thông qua thuộc tính như [Bảng], [Column]. Chỉ có 1 thuộc tính có sẵn [DbFunction], yêu cầu tệp * .edmx.
Tôi muốn có chức năng ánh xạ trong tệp * .edmx, nhưng điều đó có nghĩa là tôi không thể sử dụng ánh xạ thuộc tính cho Đối tượng: [Bảng], [Cột]. Ánh xạ phải đầy trong * .edmx hoặc trong thuộc tính.
tôi đã cố gắng để tạo ra DbModel và thêm chức năng thông qua mã này:
public static class Functions
{
[DbFunction("CodeFirstNamespace", "TestEntity")]
public static string TestEntity()
{
throw new NotSupportedException();
}
}
public class MyContext : DbContext, IDataAccess
{
protected MyContext (string connectionString)
: base(connectionString, CreateModel())
{
}
private static DbCompiledModel CreateModel()
{
var dbModelBuilder = new DbModelBuilder(DbModelBuilderVersion.Latest);
dbModelBuilder.Entity<Warehouse>();
var dbModel = dbModelBuilder.Build(new DbProviderInfo("System.Data.SqlClient", "2008"));
var edmType = PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.String);
var payload =
new EdmFunctionPayload
{
Schema = "dbo",
ParameterTypeSemantics = ParameterTypeSemantics.AllowImplicitConversion,
IsComposable = true,
IsNiladic = false,
IsBuiltIn = false,
IsAggregate = false,
IsFromProviderManifest = true,
StoreFunctionName = "TestEntity",
ReturnParameters =
new[]
{
FunctionParameter.Create("ReturnType", edmType, ParameterMode.ReturnValue)
}
};
var function = EdmFunction.Create("TestEntity", "CodeFirst", DataSpace.CSpace, payload, null);
dbModel.DatabaseMapping.Model.AddItem(function);
var compiledModel = dbModel.Compile(); // Error happens here
return compiledModel;
}
}
Nhưng có ngoại lệ:
Một hoặc nhiều lỗi xác nhận đã được phát hiện trong thế hệ người mẫu:
Edm.String: : The namespace 'String' is a system namespace and cannot be used by other schemas. Choose another namespace name.
Vấn đề nằm trong biến "edmType". Tôi không thể tạo chính xác ReturnType cho hàm. Ai có thể đề xuất cách tôi có thể thêm chức năng vào mô hình? Giao diện của chức năng thêm được hiển thị, vì vậy nó sẽ có thể làm, nhưng không có thông tin trên web cho tình huống này. Có lẽ, ai đó biết khi nào nhóm Entity Framework sẽ triển khai ánh xạ thuộc tính cho các hàm như Line To Sql.
Phiên bản EF: 6.0.0-beta1-20521
Cảm ơn!
Có, điều này phù hợp với tôi. Nhưng đối với chức năng vô hướng. Tôi cũng cần chức năng bản đồ, trả về IQueryable:
IQueryable<T> MyFunction()
Trường hợp T là EntityType hoặc RowType hoặc bất kỳ loại nào. Tôi không thể làm điều này cả (phiên bản EF là 6.0.2-21211). Tôi nghĩ rằng điều này sẽ làm việc theo cách này:
private static void RegisterEdmFunctions(DbModel model)
{
var storeModel = model.GetStoreModel();
var functionReturnValueType = storeModel.EntityTypes.Single(arg => arg.Name == "MyEntity").GetCollectionType();
var payload =
new EdmFunctionPayload
{
IsComposable = true,
Schema = "dbo",
StoreFunctionName = "MyFunctionName",
ReturnParameters =
new[]
{
FunctionParameter.Create("ReturnValue", functionReturnValueType, ParameterMode.ReturnValue)
},
Parameters =
new[]
{
FunctionParameter.Create("MyFunctionInputParameter", PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.Int32), ParameterMode.In)
}
};
storeModel.AddItem(EdmFunction.Create(
payload.StoreFunctionName,
"MyFunctionsNamespace",
DataSpace.SSpace,
payload,
payload.Parameters.Select(arg => MetadataProperty.Create(arg.Name, arg.TypeUsage, null)).ToArray()));
}
Nhưng vẫn không có may mắn:
model.Compile(); // ERROR
Có thể hay không? Có thể các bước không đúng? Có thể hỗ trợ sẽ được bổ sung tại EF 6.1. Mọi thông tin sẽ rất hữu ích.
Cảm ơn!
Bạn có DB và muốn truy cập qua Mã trước? Không cần cho mô hình sau đó. Xem http://msdn.microsoft.com/en-us/data/jj200620 –