关于数据库的ORM方便,前面的几个例子都是使用的Entity Frame,这个东西比NHibrate起步晚,而且还正在发展壮大中,所以使用的成熟度还有待考验,而微软自己的一个示范项目中,貌似就是使用的NHibrate而非EF,但是我们不能否认EF与微软产品结合的程度要高一些,并且近期EF CTP5的发布算是为这个产品吹鼓东风吧
先说下背景,有这样几个类:Princess, Unicorn, Castle, and LadyInWaiting。其中Princess能够拥有很多Unicorn、Castle以及Ladyinwaiting,但是一个Castle中只能有一个Ladyinwaiting。每一个Castle都是按照位置来做标记,他具有一个符合类型ImaginaryWorld。
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data;
using System.Data.Entity;
using System.Data.Entity.Database;
using System.Data.Entity.Infrastructure;
using System.Data.Metadata.Edm;
using System.Data.Objects;
using System.Linq;
namespace Magic.Unicorn
{
public class Princess : IPerson
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection Unicorns { get; set; }
public virtual ICollection LadiesInWaiting { get; set; }
}
public class Unicorn
{
public int Id { get; set; }
public string Name { get; set; }
[Timestamp]
public byte[] Version { get; set; }
public int PrincessId { get; set; } // FK for Princess reference
public virtual Princess Princess { get; set; }
}
public class Castle
{
[Key]
public string Name { get; set; }
public Location Location { get; set; }
public virtual ICollection LadiesInWaiting { get; set; }
}
[ComplexType]
public class Location
{
public string City { get; set; }
public string Kingdom { get; set; }
public ImaginaryWorld ImaginaryWorld { get; set; }
}
[ComplexType]
public class ImaginaryWorld
{
public string Name { get; set; }
public string Creator { get; set; }
}
public class LadyInWaiting : IPerson
{
[Key, Column(Order = 0)]
[DatabaseGenerated(DatabaseGenerationOption.None)]
public int PrincessId { get; set; } // FK for Princess reference
[Key, Column(Order = 1)]
public string CastleName { get; set; } // FK for Castle reference
public string FirstName { get; set; }
public string Title { get; set; }
[NotMapped]
public string Name
{
get
{
return String.Format("{0} {1}", Title, FirstName);
}
}
public virtual Castle Castle { get; set; }
public virtual Princess Princess { get; set; }
}
public interface IPerson
{
string Name { get; }
}
public class UnicornsContext : DbContext
{
public DbSet Unicorns { get; set; }
public DbSet
Princesses { get; set; }
public DbSet LadiesInWaiting { get; set; }
public DbSet Castles { get; set; }
}
public class UnicornsContextInitializer
: DropCreateDatabaseAlways
{
protected override void Seed(UnicornsContext context)
{
var cinderella = new Princess { Name = "Cinderella" };
var sleepingBeauty = new Princess { Name = "Sleeping Beauty" };
var snowWhite = new Princess { Name = "Snow White" };
new List
{
new Unicorn { Name = "Binky" , Princess = cinderella },
new Unicorn { Name = "Silly" , Princess = cinderella },
new Unicorn { Name = "Beepy" , Princess = sleepingBeauty },
new Unicorn { Name = "Creepy" , Princess = snowWhite }
}.ForEach(u => context.Unicorns.Add(u));
var efCastle = new Castle
{
Name = "The EF Castle",
Location = new Location
{
City = "Redmond",
Kingdom = "Rainier",
ImaginaryWorld = new ImaginaryWorld
{
Name = "Magic Unicorn World",
Creator = "ADO.NET"
}
},
};
new List
{
new LadyInWaiting { Princess = cinderella,
Castle = efCastle,
FirstName = "Lettice",
Title = "Countess" },
new LadyInWaiting { Princess = sleepingBeauty,
Castle = efCastle,
FirstName = "Ulrika",
Title = "Lady" },
new LadyInWaiting { Princess = snowWhite,
Castle = efCastle,
FirstName = "Yolande",
Title = "Duchess" }
}.ForEach(l => context.LadiesInWaiting.Add(l));
}
}
public class Program
{
public static void Main(string[] args)
{
DbDatabase.SetInitializer(new UnicornsContextInitializer());
// Many of the code fragments can be run by inserting them here
}
}
}