Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Entity Framework Ïà¹Ø¸ÅÄî֪ʶÕûÀí
 
À´Ô´£º°Ù¶È°Ù¿Æ ·¢²¼ÓÚ£º2015-9-14
  3273  次浏览      27
 

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µÄ±í½á¹¹¡£

   
3273 ´Îä¯ÀÀ       27
 
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
 
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
 
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

ʹÓÃdecj¼ò»¯Webǰ¶Ë¿ª·¢
Web¿ª·¢¿ò¼ÜÐγÉÖ®ÂÃ
¸üÓÐЧÂʵÄʹÓÃVisual Studio
MVP+WCF+Èý²ã½á¹¹´î½¨¿ò¼Ü
ASP.NETÔËÐлúÖÆÇ³Îö¡¾Í¼½â¡¿
±àд¸üºÃµÄC#´úÂë
10¸öVisual Studio¿ª·¢µ÷ÊÔ¼¼ÇÉ

.NET¿ò¼ÜÓë·Ö²¼Ê½Ó¦Óüܹ¹Éè¼Æ
.NET & WPF & WCFÓ¦Óÿª·¢
UML&.Net¼Ü¹¹Éè¼Æ
COM×é¼þ¿ª·¢
.NetÓ¦Óÿª·¢
InstallShield

ÈÕÕÕ¸Û .NET Framework & WCFÓ¦Óÿª·¢
Éñ»ªÐÅÏ¢ .NETµ¥Ôª²âÊÔ
±±¾© .NetÓ¦ÓÃÈí¼þϵͳ¼Ü¹¹
̨´ïµç×Ó .NET³ÌÐòÉè¼ÆÓ뿪·¢
ÈüÃÅÌú¿Ë C#Óë.NET¼Ü¹¹Éè¼Æ
¹ã¶«ºËµç .NetÓ¦ÓÃϵͳ¼Ü¹¹