如何安装第二章的数据库
去到本书官网的下载页面:
下载完成后执行压缩包里的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的: