将EF6 Code First字符串流畅地设置为nvarchar(max)

时间:2015-09-19 00:09:52

标签: c# entity-framework ef-code-first ef-fluent-api

我正在使用流畅的API构建EF6代码优先模型。我的理解是,默认情况下,字符串将是nvarchar(max),对于默认值,它(直言不讳)是愚蠢的。所以我添加了以下约定代码来将max default length设置为255个字符:

        modelBuilder.Properties<string>()
            .Configure(p => p.HasMaxLength(255));

然后我创建了一个像这样的装饰器:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class TextAttribute : Attribute
{
}

我想将此应用于我实际想要成为NVARCHAR(MAX)的特定字符串属性。

我在fluent API中放置了什么以确保使用[Text]装饰器的所有字符串属性都是在带有NVARCHAR(MAX)的数据库中构建的?我认为它会是这样的:

        modelBuilder.Properties<string>()
            .Where(p => p.CustomAttributes.Any(a => typeof(TextAttribute).IsAssignableFrom(a.AttributeType)))
            .Configure(p => p.HasMaxLength(?????));

或者我完全错了吗?

4 个答案:

答案 0 :(得分:18)

我不知道你现在是否找到了答案,但是如果其他人想知道怎么做,只需设置SQL数据类型并忽略HasMaxLength()调用。

        modelBuilder.Properties<string>()
            .Where(p => p.CustomAttributes.Any(a => typeof(TextAttribute).IsAssignableFrom(a.AttributeType)))
            .Configure(p => p.HasColumnType("nvarchar(max)"));

使用IsMaxLength()或HasMaxLength(null)将字段设置为nvarchar(4000)(如果将数据类型指定为varchar,则为varchar(8000))。

答案 1 :(得分:9)

如果你在#include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace cv; using namespace std; Mat src; Mat src_gray; int thresh = 100; int max_thresh = 255; RNG rng(12345); /// Function header void thresh_callback(int, void* ); /** @function main */ int main( int argc, char** argv ) { /// Load source image and convert it to gray src = imread( argv[1], 1 ); /// Convert image to gray and blur it cvtColor( src, src_gray, CV_BGR2GRAY ); blur( src_gray, src_gray, Size(3,3) ); /// Create Window char* source_window = "Source"; namedWindow( source_window, CV_WINDOW_AUTOSIZE ); imshow( source_window, src ); createTrackbar( " Canny thresh:", "Source", &thresh, max_thresh, thresh_callback ); thresh_callback( 0, 0 ); waitKey(0); return(0); } /** @function thresh_callback */ void thresh_callback(int, void* ) { Mat canny_output; vector<vector<Point> > contours; vector<Vec4i> hierarchy; /// Detect edges using canny Canny( src_gray, canny_output, thresh, thresh*2, 3 ); /// Find contours findContours( canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) ); /// Get the moments vector<Moments> mu(contours.size() ); for( int i = 0; i < contours.size(); i++ ) { mu[i] = moments( contours[i], false ); } /// Get the mass centers: vector<Point2f> mc( contours.size() ); for( int i = 0; i < contours.size(); i++ ) { mc[i] = Point2f( mu[i].m10/mu[i].m00 , mu[i].m01/mu[i].m00 ); } /// Draw contours Mat drawing = Mat::zeros( canny_output.size(), CV_8UC3 ); Mat drawing2 = Mat::zeros( canny_output.size(), CV_8UC3 ); for( int i = 0; i< contours.size(); i++ ) {if(arcLength( contours[i], true )>900) {Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) ); drawContours( drawing, contours, i, color, 2, 8, hierarchy, 0, Point() ); circle( drawing, mc[i], 4, color, -1, 8, 0 );} } int length=0; int j=0; for( int i = 0; i< contours.size(); i++ ) { if(arcLength( contours[i], true )>length) { length=arcLength( contours[i], true ); j=i; } } Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) ); drawContours( drawing2, contours, j, color, 2, 8, hierarchy, 0, Point() ); circle( drawing2, mc[j], 4, color, -1, 8, 0 ); /// Show in a window namedWindow( "Contours", CV_WINDOW_AUTOSIZE ); imshow( "Contours", drawing ); namedWindow( "Contours2", CV_WINDOW_AUTOSIZE ); imshow( "Contours_max", drawing2 ); /// Calculate the area with the moments 00 and compare with the result of the OpenCV function printf("\t Info: Area and Contour Length \n"); for( int i = 0; i< contours.size(); i++ ) { if(arcLength( contours[i], true )>900) {printf(" * Contour[%d] - Area (M_00) = %.2f - Area OpenCV: %.2f - Length: %.2f \n", i, mu[i].m00, contourArea(contours[i]), arcLength( contours[i], true ) ); Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) ); drawContours( drawing, contours, i, color, 2, 8, hierarchy, 0, Point() ); circle( drawing, mc[i], 4, color, -1, 8, 0 );} } } 课程中进行,它类似于@RickNo的答案,但是这样做:

EntityTypeConfiguration<MyEntity>

答案 2 :(得分:3)

有一种方法可以指示您使用数据库允许的最大值。

IsMaxLength()

    modelBuilder.Properties<string>()
        .Where(p => p.CustomAttributes.Any(a => typeof(TextAttribute).IsAssignableFrom(a.AttributeType)))
        .Configure(p => p.HasColumnType("nvarchar").IsMaxLength());

答案 3 :(得分:0)

您可以使用HasColumnType

enter image description here

或者您可以在没有任何HasColumnType或HasMaxLength的情况下使用。 无需使用 HasMaxLength

enter image description here