Entity Framework ¸´ÔÓÀàÐÍ
ΪÁË˵Ã÷ʲôÊǸ´ÔÓÊôÐÔ£¬ÏȾÙÒ»¸öÀý×Ó¡£
public class CompanyAddress { public int ID { get; set; } public string CompanyName { get; set; } public string StreetAddress { get; set; } public string City { get; set; } public string State { get; set; } public string ZipCode { get; set; } }
public class FamilyAddress
{
public int ID { get; set; }
public string StreetAddress { get; set; }
public string City { get; set; }
public string State { get; set; }
public string ZipCode { get; set; }
} |
ÉÏÃæÓÐÁ½¸öÀࣺ¹«Ë¾µØÖ·ºÍ¼ÒÍ¥µØÖ·£¬ËüÃÇÓÐËĸöÏàͬµÄÊôÐÔ£ºStreetAddress¡¢City¡¢State¡¢ZipCode¡£Ó³Éäµ½Êý¾Ý¿âÖеĽṹÈçͼ£º

ÕâÀÎÒÃÇ¿ÉÒÔ½«ÕâËĸöÊôÐÔ¼¯ºÏ³ÉÒ»¸ö¸´ÔÓÊôÐÔAddress£¬Ð޸ĺóµÄÀàΪ£º
public class CompanyAddress { public int ID { get; set; } public string CompanyName { get; set; } public Address Address { get; set; } }
public class FamilyAddress
{
public int ID { get; set; }
public Address Address { get; set; }
}
[ComplexType]
public class Address
{
public string StreetAddress { get; set; }
public string City { get; set; }
public string State { get; set; }
public string ZipCode { get; set; }
} |
´Ëʱ£¬ËùÉú³ÉµÄÊý¾Ý¿âÈçͼ£º

¿ÉÒÔ¿´µ½£¬Á½ÕűíÖÐÈÔÈ»¾ßÓÐÏàÓ¦µÄµØÖ·ÊôÐÔÐÅÏ¢¡£´úÂëÖеÄAddressÀà¾ÍÊǸ´ÔÓÊôÐÔ£¬Ëü²¢²»»áÔÚÊý¾Ý¿âÖÐÓ³Éä³ÉÏàÓ¦µÄ±í£¬µ«ÎÒÃǵĴúÂëÈ·¼ò½àÁËÐí¶à¡£
ËùÒÔÈç¹ûÓм¸¸öÊôÐÔÔÚ¼¸¸öÀàÖж¼ÓÐÓõ½£¬ÄÇô¾Í¿ÉÒÔ½«Õ⼸¸öÊôÐÔ¼¯ºÏ³ÉÒ»¸ö¸´ÔÓÀàÐÍ£¬²¢ÔÚÏàÓ¦µÄÀàÖÐÔö¼ÓÕâ¸ö¸´ÔÓÀàÐ͵ÄÊôÐÔ¡£
Entity Framework ²¢·¢´¦Àí
ʲôÊDz¢·¢£¿
²¢·¢·Ö±¯¹Û²¢·¢ºÍÀÖ¹Û²¢·¢¡£
±¯¹Û²¢·¢£º±ÈÈçÓÐÁ½¸öÓû§A,B£¬Í¬Ê±µÇ¼ϵͳÐÞ¸ÄÒ»¸öÎĵµ£¬Èç¹ûAÏȽøÈëÐ޸ģ¬Ôòϵͳ»á°Ñ¸ÃÎĵµËø×¡£¬B¾Íû°ì·¨´ò¿ªÁË£¬Ö»ÓеÈAÐÞ¸ÄÍ꣬ÍêÈ«Í˳öµÄʱºòB²ÅÄܽøÈëÐ޸ġ£
ÀÖ¹Û²¢·¢£ºÍ¬ÉÏÃæµÄÀý×Ó£¬A,BÁ½¸öÓû§Í¬Ê±µÇ¼£¬Èç¹ûAÏȽøÈëÐ޸Ľô¸ú×ÅBÒ²½øÈëÁË¡£AÐÞ¸ÄÎĵµµÄͬʱBÒ²ÔÚÐ޸ġ£Èç¹ûÔÚA±£´æÖ®ºóBÔÙ±£´æËûµÄÐ޸쬴Ëʱϵͳ¼ì²âµ½Êý¾Ý¿âÖÐÎĵµ¼Ç¼ÓëB¸Õ½øÈëʱ²»Ò»Ö£¬B±£´æÊ±»áÅ׳öÒì³££¬ÐÞ¸Äʧ°Ü¡£
EFÖÐÈçºÎ¿ØÖƲ¢·¢£¿
Entity Framework²»Ö§³Ö±¯¹Û²¢·¢£¬Ö»Ö§³ÖÀÖ¹Û²¢·¢¡£
Èç¹ûÒª¶Ôijһ¸ö±í×ö²¢·¢´¦Àí£¬¾ÍÔڸñíÖмÓÒ»ÌõTimestampÀàÐ͵Ä×ֶΡ£×¢Ò⣬һÕűíÖÐÖ»ÄÜÓÐÒ»¸öTimestampµÄ×ֶΡ£
Data AnnotationsÖÐÓÃTimestampÀ´±êʶÉèÖò¢·¢¿ØÖÆ×ֶΣ¬±êʶΪTimestampµÄ×ֶαØÐèΪbyte[]ÀàÐÍ¡£
public class Person { public int PersonId { get; set; } public int SocialSecurityNumber { get; set; } public string FirstName { get; set; } public string LastName { get; set; } [Timestamp] public byte[] RowVersion { get; set; } } |
Fluent APIÓÃIsRowVersion·½·¨
modelBuilder.Entity<Person>().Property(p => p.RowVersion).IsRowVersion(); |
ÎÒÃÇ¿´µ½Éú³ÉµÄÊý¾Ý¿âÖУ¬RowVersionÊÇtimestampÀàÐÍ¡£
ÏÂÃæÎÒÃÇдһ¶Î´úÂëÀ´²âÊÔһϣº
static void Main(string[] args) { var person = new Person { FirstName = "Rowan", LastName = "Miller", SocialSecurityNumber = 12345678 }; //ÐÂÔöÒ»Ìõ¼Ç¼£¬±£´æµ½Êý¾Ý¿âÖÐ using (var con = new BreakAwayContext()) { con.People.Add(person); con.SaveChanges(); }
var firContext = new BreakAwayContext();
//È¡µÚÒ»Ìõ¼Ç¼,²¢ÐÞ¸ÄÒ»¸ö×ֶΣºÕâÀïÊÇÐÞ¸ÄÁËFirstName
//ÏȲ»±£´æ
var p1 = firContext.People.FirstOrDefault();
p1.FirstName = "Steven";
//ÔÙ´´½¨Ò»¸öContext£¬Í¬ÑùÈ¡µÚÒ»Ìõ¼Ç¼£¬ÐÞ¸ÄLastName×ֶβ¢±£´æ
using (var secContext = new BreakAwayContext())
{
var p2 = secContext.People.FirstOrDefault();
p2.LastName = "Francis";
secContext.SaveChanges();
}
try
{
firContext.SaveChanges();
Console.WriteLine(" ±£´æ³É¹¦");
}
catch (DbUpdateConcurrencyException ex)
{
Console.WriteLine(ex.Entries.First().Entity.GetType().Name
+ " ±£´æÊ§°Ü");
}
Console.Read();
} |
ÉÏÃæÎÒÃÇʵÀý»¯ÁËÈý¸öDbContext,µÚÒ»¸öÔö¼ÓÒ»Ìõ¼Ç¼µ½Êý¾Ý¿âÖУ¬µÚ¶þ¸öÐ޸ĸÕÔö¼ÓµÄ¼Ç¼µ«²»±£´æ£¬È»ºóµÚÈý¸öContextҲȡ¸ÕÐÂÔöµÄ¼Ç¼²¢±£´æ£¬×îºóÔÙ±£´æµÚ¶þ¸öContext£¬½á¹û±£´æÊ§°Ü¡£

¿ÉÒÔ¿´µ½ÎÒÃǵIJ¢·¢¿ØÖÆÈ¡µ½ÁË×÷Óá£
·ÖÎöEFÉú³ÉµÄSQLÓï¾ä£º
exec sp_executesql N'update [dbo].[People] set [LastName] = @0 where (([PersonId] = @1) and ([RowVersion] = @2)) select [RowVersion] from [dbo].[People] where @@ROWCOUNT > 0 and [PersonId] = @1',N'@0 nvarchar(max) ,
@1 int,@2 binary(8)',@0=N'Francis',@1=1,@2=0x00000000000007D1 |
¿ÉÒÔ¿´µ½£¬ËüÔÚÈ¡¶ÔÓ¦¼Ç¼µÄʱºò°ÑRowVersionÒ²×÷ΪɸѡÌõ¼þ¡£ÉÏÃæÀý×ÓÖеÄsecContext±£´æµÄʱºò£¬Êý¾Ý¿âÖеÄRowVersion×ֶεÄÖµ¾Í±äÁË£¬ËùÒÔfirContext±£´æµÄʱºòÓÃÔÀ´µÄRowVersionȡֵ£¬×ÔÈ»¾ÍÈ¡²»µ½ÏàÓ¦µÄ¼Ç¼¶ø±¨´í¡£
Èç¹ûÎÒÃÇÖ»ÊÇÒª¶Ôij¸ö×Ö¶Î×÷²¢·¢¿ØÖÆÄØ£¿±ð׿±£¬EFÒ²Óа취¡£
Data AnnotationsÖÐÓÃConcurrencyCheckÀ´±êʶ
public class Person { public int PersonId { get; set; } [ConcurrencyCheck] public int SocialSecurityNumber { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public byte[] RowVersion { get; set; } } |
Fluent APIÓÃIsConcurrencyToken·½·¨
modelBuilder.Entity<Person>().Property(p => p.SocialSecurityNumber).IsConcurrencyToken(); |
ÉÏÃæµÄʵÌåÖУ¬ÎÒÃǽ«SocialSecurityNumber(Éç»á±£ÏÕºÅ)±êʶΪ¿ª·Åʽ²¢·¢£¬Ò²Ð´Ò»¸öÀàËÆµÄ´úÂë²âÊÔһϣº
static void Main(string[] args) { var person = new Person { FirstName = "Rowan", LastName = "Miller", SocialSecurityNumber = 12345678 }; //ÐÂÔöÒ»Ìõ¼Ç¼£¬±£´æµ½Êý¾Ý¿âÖÐ using (var con = new BreakAwayContext()) { con.People.Add(person); con.SaveChanges(); }
var firContext = new BreakAwayContext();
//È¡µÚÒ»Ìõ¼Ç¼,²¢ÐÞ¸ÄSocialSecurityNumber×Ö¶Î
//ÏȲ»±£´æ
var p1 = firContext.People.FirstOrDefault();
p1.SocialSecurityNumber = 123;
//ÔÙ´´½¨Ò»¸öContext£¬Í¬ÑùÈ¡µÚÒ»Ìõ¼Ç¼£¬
//ÐÞ¸ÄSocialSecurityNumber×ֶβ¢±£´æ
using (var secContext = new BreakAwayContext())
{
var p2 = secContext.People.FirstOrDefault();
p2.SocialSecurityNumber = 456;
secContext.SaveChanges();
}
try
{
firContext.SaveChanges();
Console.WriteLine(" ±£´æ³É¹¦");
}
catch (DbUpdateConcurrencyException ex)
{
Console.WriteLine(ex.Entries.First().Entity.GetType().Name
+ " ±£´æÊ§°Ü");
}
Console.Read();
} |

ÔËÐнá¹ûͬÑùÊDZ£´æÊ§°Ü£¬ËµÃ÷ÎÒÃǵIJ¢·¢¿ØÖÆÆð×÷ÓÃÁË¡£
·ÖÎöÒ»ÏÂEFÖ´ÐеÄSQL£º
exec sp_executesql N'update [dbo].[People] set [SocialSecurityNumber] = @0 where (([PersonId] = @1) and ([SocialSecurityNumber] = @2)) ',N'@0 int,@1 int,@2 int',@0=123,@1=1,@2=12345678 |
¿ÉÒÔ¿´µ½£¬EF½«ÎÒÃÇÒª²¢·¢¿ØÖƵÄÁÐSocialSecurityNumberÒ²×÷Ϊһ¸öɸѡÌõ¼þ£¬ÕâÑùfirContext±£´æµÄʱºòÒ²»áÒòΪµÄÊý¾Ý¿âÖÐSocialSecurityNumberÖµ±äÁË£¬È¡²»µ½¶ÔÓ¦µÄ¼Ç¼¶ø¸üÐÂʧ°Ü¡£
²¹³äһϣºÈç¹ûÊÇEDMXÈçºÎ½«×Ö¶ÎÉèÖÃΪConcurrency¡£ºÜ¼òµ¥£¬ÔÚ¶ÔÓ¦µÄ×Ö¶ÎÉÏÓÒ¼ü-ÊôÐÔ¡£ÔÚ´ò¿ªµÄÊôÐÔ´°¿ÚÖÐÓÐÒ»¸ö²¢·¢Ä£Ê½£¬Ä㽫ËüÑ¡ÔñΪFixed¼´¿É¡£

Entity Framework Êý¾ÝÉú³ÉÑ¡ÏîDatabaseGenerated
ÔÚEFÖУ¬ÎÒÃǽ¨Á¢Êý¾ÝÄ£Ð͵Äʱºò£¬¿ÉÒÔ¸øÊôÐÔÅäÖÃÊý¾ÝÉú³ÉÑ¡ÏîDatabaseGenerated£¬ËüºóÓÐÈý¸öö¾ÙÖµ£ºIdentity¡¢NoneºÍComputed¡£
Identity£º×ÔÔö³¤
None£º²»´¦Àí
Computed£º±íʾÕâÒ»ÁÐÊǼÆËãÁС£
ÔÚEFÖУ¬Èç¹ûÖ÷¼üÊÇintÀàÐÍ£¬Code FirstÉú³ÉÊý¾Ý¿âµÄʱºò»á×Ô¶¯ÉèÖøÃÁÐΪ×ÔÔö³¤¡£µ«Èç¹ûÖ÷¼üÊÇGuidÀàÐÍ£¬ÎÒÃǾÍÒªÊÖ¶¯µÄÈ¥ÉèÖÃÁË¡£
¶ÔÓÚÏÂÃæµÄÄ£ÐÍ£¬Èç¹ûÎÒÃÇûÓÐÉèÖÃ×ÔÔö³¤£¬Êý¾Ý¿âÖлáÒÔ0À´Ìî³ä
public class Person { [Key] public Guid SocialSecurityNumber { get; set; } public string FirstName { get; set; } public string LastName { get; set; } } |
var person = new Person { FirstName = "Rowan", LastName = "Miller", }; using (var context = new BreakAwayContext()) { context.People.Add(person); context.SaveChanges(); } |

²åÈëµÚ¶þÌõ¼Ç¼µÄʱºò¾Í»á±¨´íÁË¡£ËùÒÔ£¬ÏÂÃæµÄÄ£ÐÍÉèÖòÅÊÇÕýÈ·µÄ¡£
public class Person { [Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)] public Guid SocialSecurityNumber { get; set; } public string FirstName { get; set; } public string LastName { get; set; } } |
ÏÖÔÚÎÒÃÇÀ´¿´¿´ÓÐЩÇé¿öÅäÖÃΪNoneÒ²ÊÇÓÐÓõġ£ÐÞ¸ÄÒ»ÏÂÉÏÃæµÄÄ£ÐÍ¡£
public class Person { [Key] public int SocialSecurityNumber { get; set; } public string FirstName { get; set; } public string LastName { get; set; } } |
ÎÒÃÇÔÙ²åÈëÒ»Ìõ¼Ç¼¿´¿´
var person = new Person { FirstName = "Rowan", LastName = "Miller", SocialSecurityNumber = 12345678 };
using (var context = new BreakAwayContext())
{
context.People.Add(person);
context.SaveChanges();
} |

ÔÚÊý¾Ý¿âÖд洢µÄÊÇ1£¬²¢²»ÊÇÎÒÃÇËùÏëÒªµÄ12345678.ÕâÊÇÎªÊ²Ã´ÄØ£¿
ÒòΪÖ÷¼üÊÇSocialSecurityNumberÊÇIntÀàÐÍ£¬Code
FirstÔÚÊý¾Ý¿âÖжԸÃÁÐ×÷×ÔÔö³¤´¦Àí¡£Õâʱ£¬ÎÒÃÇÏëÔÙ²åÈë×Ô¶¨ÒåµÄSocialSecurityNumber¾Í²»ÐÐÁË¡£
ËùÒÔµ±ÎÒÃÇÏëÕâÑù×öʱ£¬¾ÍÓ¦¸Ã°ÑSocialSecurityNumberµÄ×ÔÔö³¤ÅäÖÃΪNone.
public class Person { [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] public int SocialSecurityNumber { get; set; } public string FirstName { get; set; } public string LastName { get; set; } } |
Èç¹û¶ÔÊôÐÔ±êʶΪComputed£¬EF»áÈÏΪ¸ÃÁÐÊÇͨ¹ýÆäËüÁмÆËãµÃ³öµÄ£¬²»»á½«Æä³Ö¾Ã»¯µ½Êý¾Ý¿âÖС£
public class Person { [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] public int SocialSecurityNumber { get; set; } public string FirstName { get; set; } public string LastName { get; set; } [DatabaseGenerated(DatabaseGeneratedOption.Computed)] public string Name { get; set; } } |
var person = new Person { FirstName = "Rowan", LastName = "Miller", SocialSecurityNumber = 1231478, Name = "Rowan Miller", };
using (var context = new BreakAwayContext())
{
context.People.Add(person);
context.SaveChanges();
} |
²é¿´Êý¾Ý¿â£¬ÎÒÃÇ¿´µ½Name²¢Ã»Óд洢ÈκÎÖµ¡£

Entity Framework Code First¼¶ÁªÉ¾³ý
ʹÓÃData Annotations£º
Èç¹ûÎÒÃÇÒªµ½Ò»¶ÔÖ÷´Ó±íÔö¼Ó¼¶ÁªÉ¾³ý£¬ÔòÒªÔÚÖ÷±íÖеÄÒýÓÃÊôÐÔÉÏÔö¼ÓRequired¹Ø¼ü×Ö£¬È磺
public class Destination { public int DestinationId { get; set; } public string Name { get; set; } public string Country { get; set; } public string Description { get; set; } public byte[] Photo { get; set; } public List<Lodging> Lodgings { get; set; } }
public class Lodging
{
public int LodgingId { get; set; }
public string Name { get; set; }
public string Owner { get; set; }
public bool IsResort { get; set; }
public decimal MilesFromNearestAirport { get;
set; }
[Required]
public Destination Destination { get; set; }
} |
¿ÉÒÔ¿´µ½£¬ÔÚÉú³ÉµÄÊý¾Ý¿âÖУ¬Íâ¼üÓ¦ÓÃÁ˼¶ÁªÉ¾³ý¹æÔò

ʹÓÃFluent API£º
modelBuilder.Entity<Lodging>().HasRequired(l => l.Destination).WithMany(d => d.Lodgings).WillCascadeOnDelete(true); |
Ïà¶ÔÓ¦µÄ£¬Èç¹ûÒª¹Ø±Õ¼¶Áª¹¦ÄÜÔòΪ£º
modelBuilder.Entity<Lodging>().HasRequired(l => l.Destination).WithMany(d => d.Lodgings).WillCascadeOnDelete(false); |
Entity Framework Code FirstÔÚOracleϵÄαʵÏÖ
ΪʲôҪ˵ÊÇαʵÏÖ£¬ÒòΪ»¹×ö²»µ½ÀàËÆMsSqlÖÐÄÇÑùÍêÈ«µÄ¹¦ÄÜ¡£OralceÖеÄÊý¾Ý¿â»¹ÊÇÒªÎÒÃÇ×Ô¼ºÊÖ¶¯È¥´´½¨µÄ¡£ÕâÀÎÒÃÇÉáµôÁËModel
FirstÖеÄEDMXÎļþ£¬×Ô¼ºÔÚ´úÂëÀïÃæÐ´Ä£ÐÍÓëÓ³Éä¹ØÏµ£¬ÕâÓÖÓеãÏñÊÇCode FirstÄ£ÐÍÁË£¬ËùÒÔÎÒ˵ËüÊÇÒ»¸öαʵÏÖ¡£ÕæÕýÍêÈ«µÄCode
FirstÓ¦¸ÃÊÇҪͨ¹ýOracle¿ª·¢Çý¶¯À´Ö§³ÖÁË¡£
ͨ¹ýEFÀ´Á¬½ÓOracleÊý¾Ý¿â£¬Ç°ÌáÊÇÒªÏÂÔØODP.NETÇý¶¯¡£GoogleһϾÍÕҵõ½ÁË¡£
Ä£ÐÍ
public class Student { public Student() { this.Teachers = new HashSet<Teacher>(); } public Guid ID { get; set; } public string Name { get; set; } public int StudnetNumber { get; set; } public bool IsMale { get; set; }
public virtual ICollection<Teacher> Teachers
{ get; set; }
}
public class Teacher
{
public Teacher()
{
this.Students = new HashSet<Student>();
}
public Guid ID { get; set; }
public string Name { get; set; }
public virtual ICollection<Student> Students
{ get; set; }
} |
Ä£Ðͺܼòµ¥£¬ÕâÀïдÁËÁ½¸öʾÀýÄ£ÐÍ£¬Student ÓëTeacher£¬²¢ÇÒËüÃÇÖ®¼äÊǶà¶Ô¶àµÄ¹ØÏµ¡£
Ö÷¼üµÄÅäÖÆ
OralceÊý¾Ý¿âÖÐÖ÷¼üÓÐÁ½ÖÖ·½Ê½£ººǫ́ͨ¹ýÊý¾Ý¿â×Ô¼ºÈ¥Éú£¬±ÈÈ磺trigger+sequence½áºÏµÄ·½Ê½À´²úÉú×ÔÔö³¤µÄÖ÷¼ü;»¹ÓÐÒ»ÖÖ¾ÍÊÇͨ¹ýǰ̨ÏÔʾµÄ¸øID¸³Öµ£¬ÈçID=1À´²åÈëµ½Êý¾Ý¿â¿âÖС£Èç¹ûÄãÏëͨ¹ýǰ̨×Ô¼ºÊÖ¶¯À´²åÈëµÄ»°£¬ÒªÅäÖÃÖ÷¼üµÄ×ÔÔö³¤ÎªNONE¡£
HasKey(k => k.ID); Property(p => p.ID).HasColumnName("ID").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); |
Êý¾ÝÀàÐ͵ÄÓ³Éä
ODP.NETÄܹ»Ö§³Ö´ó¶àÊýÊý¾ÝÀàÐ͵Ä×Ô¶¯Ó³É䣬±ÈÈçint,datetime,stringµÈ¡£µ«¶ÔÓÚÒ»Ð©ÌØ±ðÊý¾ÝÀàÐÍ£¬±ÈÈçboolean,guid£¬OracleÊý¾Ý¿âÖв¢Ã»ÓжÔÓ¦µÄbitÀàÐÍ»òÊÇGUIDÀàÐÍ¡£ÎÒÃÇÒªÔÚÓ³ÉäµÄʱºòÏÔʾָ¶¨¡£
//GUIDÀàÐ͵ÄÓ³Éä Property(p => p.TypeCode).HasColumnName("TYPECODE").HasColumnType("GUID"); //booleanÀàÐ͵ÄÓ³Éä Property(p => p.IsSale).HasColumnName("ISSALE").HasColumnType("odp_internal_use_type"); |
¹ØÏµµÄÓ³Éä
ODP.NETÄܹ»ºÜºÃµÄÖ§³ÖÒ»¶Ô¶àµÄÓ³É䣬һ¶Ô¶àµÄÓ³Éä¾ÍÏñÎÒÃÇÔÚÅäÖÃMsSqlÊý¾Ý¿âÖÐÒ»Ñù¡£
¶à¶Ô¶à¹ØÏµµÄÓ³É䣺ÒòΪÁ½¸ö¶à¶Ô¶àµÄ±í£¬»á²úÉúÒ»¸öÖмä±í£¬ÓÃÀ´±£´æÕâÁ½ÕűíµÄÖ÷¼ü£¬Õâ¾ÍÒªÇóEFÄܹ»»ñµÃÕâÁ½ÕűíµÄÖ÷¼ü¡£Èç¹ûÕâÁ½ÕűíµÄÖ÷¼üÊÇÔÚÊý¾Ý¿âÖÐͨ¹ýSequenceÀ´Éú³ÉµÄ£¬EF¾ÍÎÞ·¨»ñÈ¡¡£ËùÒÔ£¬Èç¹ûÒªÅäÖñíÖ®¼äµÄ¶à¶Ô¶à¹ØÏµ£¬±íµÄÖ÷¼ü±ØÐëÊÇͨ¹ýǰ̨ÏÔʾ²åÈëµÄ¡£
HasMany(t => t.Teachers).WithMany(s => s.Students).Map(m => { m.MapLeftKey("STUDENTID"); m.MapRightKey("TEACHERID"); m.ToTable("STUDENT_TEACHER", "GYOUNG"); }); |
×ܵÄÓ³ÉäÈçÏ£º
public class StudentConfiguration : EntityTypeConfiguration<Student> { public StudentConfiguration() { HasKey(k => k.ID); Property(p => p.ID).HasColumnName("ID").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None) //GUIDÀàÐ͵ÄÓ³Éä .HasColumnType("GUID"); Property(p => p.Name).HasColumnName("NAME"); //boolÀàÐ͵ÄÓ³Éä Property(p => p.IsMale).HasColumnName("ISMALE").HasColumnType("odp_internal_use_type"); Property(p => p.StudentNumber).HasColumnName("STUDENTNUMBER");
HasMany(t => t.Teachers).WithMany(s =>
s.Students).Map(m =>
{
//LeftKey µ±Ç°±íµÄÖ÷¼ü
m.MapLeftKey("STUDENTID");
//RightKey ÁíÒ»ÕűíµÄÖ÷¼ü
m.MapRightKey("TEACHERID");
//±ØÐëÖ¸¶¨Êý¾Ý¿â¼Ü¹¹Ãû³Æ
m.ToTable("STUDENT_TEACHER", "GYOUNG");
});
//±íÃû+Êý¾Ý¿â¼Ü¹¹Ãû
ToTable("STUDENT", "GYOUNG");
}
}
public class TeacherConfiguration : EntityTypeConfiguration<Teacher>
{
public TeacherConfiguration()
{
HasKey(k => k.ID);
Property(p => p.ID).HasColumnName("ID").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)
.HasColumnType("GUID");
Property(p => p.Name).HasColumnName("NAME");
ToTable("TEACHER", "GYOUNG");
}
} |
DbContext
public class TestContext : DbContext { public DbSet<Student> Students { get; set; } public DbSet<Teacher> Teachers { get; set; }
protected override void OnModelCreating(DbModelBuilder
modelBuilder)
{
modelBuilder.Configurations.Add(new TeacherConfiguration()).Add(new
StudentConfiguration());
base.OnModelCreating(modelBuilder);
}
} |
¸½´´½¨±íµÄSQL£º
-- Creating table 'TEACHERS' CREATE TABLE "GYOUNG"."TEACHERS" ( "ID" RAW(16) NOT NULL, "NAME" NVARCHAR2(200) NULL );
-- Creating table 'STUDENTS'
CREATE TABLE "GYOUNG"."STUDENTS"
(
"ID" RAW(16) NOT NULL,
"NAME" NVARCHAR2(200) NULL,
"ISMALE" NUMBER(10,0) NULL,
"STUDENTNUMBER" NUMBER(10,0) NULL
);
-- Creating table 'STUDENT_TEACHER'
CREATE TABLE "GYOUNG"."STUDENT_TEACHER"
(
"STUDENTID" RAW(16) NOT NULL,
"TEACHERID" RAW(16) NOT NULL
); |
Íü¼ÇÁËÅäÖ㬲¹Ìùһϣº
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection,
EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </configSections> <connectionStrings> <add name="MfTest" providerName="Oracle.DataAccess.Client"
connectionString="Data Source=Gyoung;user id=test;password=123456" /> </connectionStrings> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> </entityFramework> <oracle.dataaccess.client> <settings> <add name="bool" value="edmmapping number(1,0)" /> <add name="byte" value="edmmapping number(3,0)" /> <add name="int16" value="edmmapping number(4,0)" /> <add name="int32" value="edmmapping number(9,0)" /> <add name="int64" value="edmmapping number(18,0)" /> </settings> </oracle.dataaccess.client> </configuration> |
MfTest¾ÍÊÇÁ¬½Ó×Ö·û´®£¬ºÍSQLSERVER²î²»¶à£¬²¢Ã»ÓÐʲô¹Ø¼üµÄÉè¼Æ¡£Êý¾Ý¿âÃûÊÇGyoung,Äã×Ô¼ºÒªÔÚOracleÖÐtnsnames.oraÎļþÖÐÈ¥ÅäÖüàÌýµØÖ·¡£
ÈÃEF·ÉÒ»»á¶ù:ÈçºÎÓÃEntity Framework 6 Á¬½ÓSqliteÊý¾Ý¿â
»ñÈ¡Sqlite
1.¿ÉÒÔÓÃNuGet³ÌÐò°üÀ´»ñÈ¡£¬ËüÒ²»á×Ô¶¯ÏÂÔØEF6

2.ÔÚSqlite¹ÙÍøÉÏÏÂÔØ¶ÔÓ¦µÄ°æ±¾£ºhttp://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki
×¢ÒâÕâÀïÃæÃ¿¸ö.net framework¶¼ÓÐÁ½¸ö°æ±¾£¬Ò»¸ö´øÓÐbundle×ÖÑÛ£¬Ò»¸öûÓС£Ò»¸ö°²×°µÄDLLÀïÃæ°üº¬SQLite.Interop.dll£¬¶øÁíÒ»¸öûÓС£Èç¹ûÄãÔËÐдúÂëµÄʱºò±¨
¡°ÎÞ·¨¼ÓÔØSQLite.Interop.dll¡±µÄ´íÎó£¬Ôò½«°²×°ÎļþÖеÄSQLite.Interop.dll¿½±´µ½BinÎļþÖм´¿É¡£»òÊÇÔÚNuGetÏÂÔØµÄpackages\System.Data.SQLite.Core.1.0.94.0\buildÖÐÒ²ÓжÔÓ¦µÄ³ÌÐò¡£
ʾÀý´úÂë
Model.cs
public class Person { public Int64 Id { get; set; } //×¢ÒâÒªÓÃInt64 public string FirstName { get; set; } public string LastName { get; set; } }
public class MyContext : DbContext
{
public DbSet<Person> Persons { get; set;
}
public MyContext()
: base("SqliteTest")
{
}
} |
Program.cs
static void Main(string[] args) { MyContext context = new MyContext(); var empList = context.Persons.OrderBy(c => c.FirstName).ToList(); Console.WriteLine(empList.Count);
Person people = new Person()
{
FirstName = "Hello",
LastName = "World"
};
context.Persons.Add(people);
context.SaveChanges();
Console.ReadLine();
} |
ʾÀý´úÂëºÜ¼òµ¥£¬¾ÍÊÇÓÃEF¶ÔPerson±í½øÐÐÐÂÔöÓë²é¿´¡£
ÅäÖÃconfigÎļþ
Èç¹ûÄãÊÇÓÃNuGet»ñÈ¡Sqlite£¬»á×Ô¶¯ÔÚconfigÖÐÅäÖÃһЩÏà¹ØµÄÐÅÏ¢¡£
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection,
EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </configSections> <connectionStrings> <add name="SqliteTest" connectionString="data source=SqliteTest.db" providerName="System.Data.SQLite.EF6" /> </connectionStrings> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <system.data> <DbProviderFactories> <add name="SQLite Data Provider" invariant="System.Data.SQLite"
description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" /> <remove invariant="System.Data.SQLite" /> <remove invariant="System.Data.SQLite.EF6" /> <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6"
description=".NET Framework Data Provider for SQLite (Entity Framework 6)"
type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" /> </DbProviderFactories> </system.data> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="v11.0" /> </parameters> </defaultConnectionFactory> <providers> <provider invariantName="System.Data.SqlClient"
type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> <provider invariantName="System.Data.SQLite.EF6"
type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" /> </providers> </entityFramework> </configuration> |
ÆäÖÐÊý¾ÝÁ¬½Ó´®ÊÇ£º
<add name="SqliteTest" connectionString="data source=SqliteTest.db" providerName="System.Data.SQLite.EF6" /> |
×¢ÒâÌṩ³ÌÐò¼¯ÊÇSystem.Data.SQLite.EF6¡£
µ«ÊÇÕâ¸öÅäÈÔÈ»ÊÇ´íÎóµÄ¡£
Èç¹û´ËʱÔËÐгÌÐò£¬»á±¨´í£º
Unable to determine the provider name
for provider factory of type 'System.Data.SQLite.SQLiteFactory'.
Make sure that the ADO.NET provider is installed or
registered in the application config.
»òÖÐÎÄ´íÎóÐÅÏ¢£º
δÕÒµ½¾ßÓй̶¨Ãû³Æ¡°System.Data.SQLite¡±µÄ ADO.NET
Ìṩ³ÌÐòµÄʵÌå¿ò¼ÜÌṩ³ÌÐò¡£ÇëÈ·±£ÔÚÓ¦ÓóÌÐòÅäÖÃÎļþµÄ¡°entityFramework¡±½ÚÖÐ×¢²áÁ˸ÃÌṩ³ÌÐò¡£
Òâ˼ÊÇEFûÓÐÕÒµ½ÌṩSystem.Data.SQLite.SQLiteFactoryµÄdll£¬ÎÒÃÇ¿´¿´ÏÖÔÚconfigÖеÄentityFramework½Úµã£º
<entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="v11.0" /> </parameters> </defaultConnectionFactory> <providers> <provider invariantName="System.Data.SqlClient"
type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> <provider invariantName="System.Data.SQLite.EF6"
type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" /> </providers> </entityFramework> |
ÓÐSystem.Data.SQLite.EF6ÓëSystem.Data.SqlClient£¬È·ÊµÃ»ÓÐÃû³ÆÎªSystem.Data.SQLiteµÄÌṩ³ÌÐò¡£ÕâÀïÎÒÒ»Ö±²»Ã÷°×Ϊʲôsqlite»áÈ¥ÕÒÃû³ÆÎªSystem.Data.SQLiteµÄÌṩ³ÌÐò£¬ÒòΪÎÒÃÇÔÚÁ¬½Ó´®ÖÐÅäÖõÄproviderÒ²ÊÇSystem.Data.SQLite.EF6¡£
ÄÇÎÒÃǾÍÔÚEFµÄÅäÖýڵãÖÐÔö¼ÓÒ»¸öÃûΪSystem.Data.SQLiteµÄprovider£¬µ«typeÈÔÈ»ÊÇSystem.Data.SQLite.EF6¡£×îÖÕµÄÅäÖÃÈçͼ£º
ºìÉ«²¿·ÖÊÇÅäÖÃÓб仯µÄµØ·½¡£
ÕâÀïÔÙÔËÐгÌÐò¾Í¿ÉÒÔÁË¡£
×¢Ò⣺
1.Á¬½Ó´®µÄÅäÖá£
Êý¾ÝÁ¬½Ó´®¿ÉÒÔÖ¸¶¨¾ø¶ÔµØÖ·£¬Ò²¿ÉÒÔÖ¸¶¨Ïà¶ÔµØÖ·¡£ÏñÎÒµÄdata source=SqliteTest.db£¬ÔòSqliteTest.dbÒªÔÚBinÎļþ¼ÐÖУ¬Èç¹ûÊÇweb³ÌÐò¿ÉÒÔͨ¹ýData
Source=|DataDirectory|\SqliteTest.dbÀ´ÅäÖÃÔÚApp_DataÎļþƽÖС£
2.Èç¹ûûÓÐÖ¸¶¨Êý¾Ý¿âÖеıíÎļþÃû£¬EFÉú³ÉµÄSQL±í¶¼ÊÇÓø´Êý±íʾ¡£¾ÍÏñÎҵijÌÐòÖÐʵÌåÃûÊÇPerson,µ«EFÈ¥²éÕҵıíÃû»áÊÇPeople¡£ËùÒÔÔÚÊý¾Ý¿âÖж¨ÒåµÄ±íÃûÊÇPeople¡£
3.²»Ö§³ÖCodeFirstģʽ£¬ÄúÐèÒª×Ô¼ºÏÈÉè¼ÆºÃSqliteµÄ±í½á¹¹¡£
|