Note On <Programming Entity Framework 2nd Edition> -01: How to Use LINQPad 4.5

50 篇文章 0 订阅
15 篇文章 0 订阅

如何安装第二章的数据库

去到本书官网的下载页面:


下载完成后执行压缩包里的SQLPackageSampleDatabaseChapters2thru6.exe文件,运行结果如下:



从下面的论坛页面中找到解决方法:

http://forums.oreilly.com/topic/35700-programmingefdb1/

将(local)修改为.\SQLEXPRESS。(注:我所安装的是Visual Studio Express 2013 for Desktop 和SQL Server 2012)



再执行:



数据库安装成功。


现在来执行书中的操作,从书中没有给截图的部分开始,就是添加ADO.NET Entity Data Model之后:



下面这个版面在第一次进去时,原本多数空格都是空白的,要点击'New Connection',在新弹出的界面配置好之后再回来时,就会看到下面这样了。



而新弹出的界面将会是:







我还是得到一个错误:


用EF6.0最终生成的文件:



注意EF6.0与EF4.0的差别,与后者把自动生成的class放在同一个cs文件里不同,6.0是把它们分开放在自己专属的cs文件里,图中的Model1.Context.cs与Address.cs,Contact.cs和vOfficeAddresses.cs分别对应4.0会生成的XXXModel.Designer.cs文件中的各个类。

using ...

[assembly: EdmSchemaAttribute()]

[assembly: EdmRelationshipAttribute("samsunginternalModel", "FK_systemUserRole_Role", "Role", System.Data.Metadata.Edm.RelationshipMultiplicity.ZeroOrOne, typeof(SamsungCRM.Models.Role), "systemUserRole", System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(SamsungCRM.Models.systemUserRole), true)]


namespace SamsungCRM.Models
{

	public partial class samsunginternalEntities : ObjectContext
	{
		public samsunginternalEntities() : base("name=samsunginternalEntities", "samsunginternalEntities")
		{
			this.ContextOptions.LazyLoadingEnabled = true;
			OnContextCreated();
		}

		public samsunginternalEntities(string connectionString) : base(connectionString, "samsunginternalEntities")
		{
			this.ContextOptions.LazyLoadingEnabled = true;
			OnContextCreated();
		}

		public samsunginternalEntities(EntityConnection connection) : base(connection, "samsunginternalEntities")
		{
			this.ContextOptions.LazyLoadingEnabled = true;
			OnContextCreated();
		}

		partial void OnContextCreated();

		public ObjectSet<audit_log> audit_log
		{
			get
			{
				if ((_audit_log == null))
				{
				    _audit_log = base.CreateObjectSet<audit_log>("audit_log");
				}
				return _audit_log;
			}
		}
		private ObjectSet<audit_log> _audit_log;		
		
	}


	[EdmEntityTypeAttribute(NamespaceName="samsunginternalModel", Name="audit_log")]
	[Serializable()]
	[DataContractAttribute(IsReference=true)]
	public partial class audit_log : EntityObject
	{
		#region Factory Method
	
		/// <summary>
		/// Create a new audit_log object.
		/// </summary>
		/// <param name="id">Initial value of the Id property.</param>
		/// <param name="vincesMessage">Initial value of the VincesMessage property.</param>
		/// <param name="createDatetime">Initial value of the CreateDatetime property.</param>
		public static audit_log Createaudit_log(
													global::System.Int32 id, 
													global::System.String vincesMessage, 
													global::System.DateTime createDatetime
												)
		{
			audit_log audit_log = new audit_log();
			audit_log.Id = id;
			audit_log.VincesMessage = vincesMessage;
			audit_log.CreateDatetime = createDatetime;
			return audit_log;
		}

		#endregion

		#region Primitive Properties
	
		/// <summary>
		/// No Metadata Documentation available.
		/// </summary>
		[EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
		[DataMemberAttribute()]
		public global::System.Int32 Id
		{
			get
			{
				return _Id;
			}
			set
			{
				if (_Id != value)
				{
					OnIdChanging(value);
					ReportPropertyChanging("Id");
					_Id = StructuralObject.SetValidValue(value);
					ReportPropertyChanged("Id");
					OnIdChanged();
				}
			}
		}
		private global::System.Int32 _Id;
		partial void OnIdChanging(global::System.Int32 value);
		partial void OnIdChanged();

		...

		
		#endregion
	
	}
	

}


6.0生成的文件则是这样的:

namespace Chp2ConsoleApp
{
	using System;
	using System.Data.Entity;
	using System.Data.Entity.Infrastructure;
	
	public partial class SampleEntities : DbContext
	{
		public SampleEntities()
			: base("name=SampleEntities")
		{
		}
	
		protected override void OnModelCreating(DbModelBuilder modelBuilder)
		{
			throw new UnintentionalCodeFirstException();
		}
	
		public virtual DbSet<Address> Address { get; set; }
		public virtual DbSet<Contact> Contacts { get; set; }
		public virtual DbSet<vOfficeAddresses> vOfficeAddresses { get; set; }
	}
}

namespace Chp2ConsoleApp
{
	using System;
	using System.Collections.Generic;
	
	public partial class Address
	{
		public int addressID { get; set; }
		public string Street1 { get; set; }
		public string Street2 { get; set; }
		public string City { get; set; }
		public string StateProvince { get; set; }
		public string CountryRegion { get; set; }
		public string PostalCode { get; set; }
		public string AddressType { get; set; }
		public int ContactID { get; set; }
		public System.DateTime ModifiedDate { get; set; }
	
		public virtual Contact Contact { get; set; }
	}
}

如果想要打开Entity Container的属性,需要在界面空白处右击鼠标。




而且,不同版本的EF生成EDMX时会基于不同版本的标准,下图中Notepad打开的EDMX是用EF4.0生成的。




如何安装并使用LINQPad



在上面所示的官网页面下载,然后安装,然后执行。


在能够对一个数据库进行访问之前,要先配置数据库连接,点击左上角的“Add Connection”



因为我打算连接到一个用EF4.0建立的访问,所以我选择了Entity Framework(ObjectContext),而DbContext应该是6.0的术语。点击下一步。

在新界面中,选择Browse,找到你的VS项目构建生成的dll文件:


就像你看到了,其他的信息会被自动填入。



点击完成就可以了。


现在来用LINQ to Entities写个查询试一下,



你可以同时看到它是如何被转译成lambda表达式和SQL的:






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值