ソース学習のASP.NET MVC Application Using Entity Framework

3869 ワード

ソース学習の重要性は、もう一度納得させられる.ASP.NET MVC Application Using Entity Framework Code First
MVCをするのはすでに时间があって、しかしいくつかCodePlexの上のコードを见て、依然として学ぶ必要があるものがまだ多くて、基本的に机能はすべて実现することができて、しかしもしフレームワーク自身がすでに集积して提供した便利性の机能を利用することを放弃するならば、それは往々にして事倍功半、つまり実现することができて、きれいで専门的ではありませんて、気分が悪いです.
多くの専门のものはすべてそこにあって、大丈夫に见て、すぐに老三様になってはいけなくて、あるいは良いものを放弃して、自分の古い方法で経験的な解决に行って、実现することができる以上、それでは最もきれいな解决方法を探して、さもなくばどのように升格します.
  • 仮想属性
  • 
     	//      。      overrides     ,
    	//      get set   ,         。
    	public virtual string Name { get; set; }
    
    	
    	//           
             private int num;
             public virtual int Number
             {
                 get { return num; }
                 set { num = value; }
             }
  • DataType Custom,DateTime,Date,Time,Duration,PhoneNumber,Currency,Text,Html,MultilineText,EmailAddress,Password,Url,ImageUrl,CreditCard,PostalCode,Upload,多くのよく使われる検証はすでにパッケージされており、使うだけでいいので、これ以上苦労して正則を書かないでください.

  • MetadataTypeAttribute
    [MetadataType(typeof(CustomerMetaData))]
    public partial class Customer
    {	}
    public class CustomerMetaData
    {
        // Apply RequiredAttribute
        [Required(ErrorMessage = "Title is required.")]
        public object Title;
    }

    MetadataTypeAttributeプロパティを使用すると、クラスをデータモデル区分クラスに関連付けることができます.この関連クラスでは、データモデルにない追加メタデータ情報を指定できます.これにより,DataBaseにおけるクラスの基本定義とCoding時のクラスの付加性の検証がより良く区別され,2枚の構造が明確になり,分業が明確になる.
    [MetadataType(typeof(CompanyMetadata))]
    public partial class Company
    {
        public class CompanyMetadata
        {
            [JsonIgnore]//  API        
            public virtual ICollection<Advertise> Advertise { get; set; }
        }
    }
  • rowversion

  • rowversionデータ型を使用した楽観的ロックSQL Server 2008は、アプリケーションで楽観的ロックを実行するために使用できる特殊なデータ型rowversionを提供します.rowversionデータ型は、楽観的ロックモードでバージョン番号として機能します.rowversionタイプのデータ列を含む行が挿入または更新されるたびに、SQL Serverはその列の値を自動的に生成します.rowversionデータ型は8バイトのバイナリデータ型であり、値の一意性と一方向成長を保証する以外、その値は意味がない.バイトごとに意味を理解することはできません.
    クライアントはテーブルからデータを読み込み、返される結果セットにプライマリ・キーとrowversion列、および他の目的のデータ列が含まれていることを確認します.クエリはトランザクションで実行されないため、データが読み込まれると、SELECTクエリが取得したロックが解放されます.一定時間後にユーザーがローを更新したい場合は、その間に他のクライアントによってデータが変更されていないことを確認する必要があります.Update文には、取得したrowversion値とデータベース内のカラムの現在の値を比較するWHERE句が含まれている必要があります.2つの値が一致する(同じ)場合、ローレコードはその間に変更されていないことを示します.そのため安心して変更を提出できます.一致しない場合は、ローレコードが変更されたことを示します.Lost Updateの問題が発生しないように、今回の更新はコミットしないでください.
  • Linq to SQlと従来のSQl文の統合
  • ```
    ViewBag.RowsAffected = db.Database.ExecuteSqlCommand("UPDATE Course SET Credits = Credits * {0}", multiplier);
    
    string query = "SELECT EnrollmentDate, COUNT(*) AS StudentCount "
                + "FROM Person "
                + "WHERE Discriminator = 'Student' "
                + "GROUP BY EnrollmentDate";
            IEnumerable<EnrollmentDateGroup> data = db.Database.SqlQuery<EnrollmentDateGroup>(query);
    
     IQueryable<Course> courses = db.Courses;
     var sql = courses.ToString();
  • 遅延、餓死者、および明示的なロード関連データ
    var departments = context.Departments;
    foreach(Department d in departments)
    {foreach get course.} 
    //Lazy Loading関連属性に最初にアクセスすると、関連データが自動的に読み出されます.
    var departments = context.Departments.Include(x=x.Course){foreach,foreach get course}
    //Eager Loadingエンティティがロードされると、関連するデータも一緒にロードされます.Dbにクエリーを1回だけ送信するため、パフォーマンスが最も優れています.
    var departments = context.Departments.ToList();
    Context.Entry(d).Collection(x=>x.Courses).Load(); 
    //Explict Loadingは、関連エンティティのプロパティに頻繁にアクセスしないか、一部のみアクセスすると、遅延ロードがより効果的です.

  • データベースコンテキストのデフォルトでは、遅延ロードがサポートされています.遅延ロードを閉じるには、特定のナビゲーション属性について、属性を定義するときにvirtualがすべてのナビゲーション属性についてキャンセルし、LazyLoadingEnabledを偽に設定する2つの方法があります.