1. Entity Framework安裝,只能安裝最新版本,不能安裝就舊版本嗎
正在安裝 'EntityFramework 5.0.0'。
您即將從 Microsoft 下載 EntityFramework,您可以在 http://go.microsoft.com/fwlink/?LinkId=253898&clcid=0x409 取得它的授權合約。請檢查套件是否有其他相依項目,這些相依性可能隨附自己的授權合約。只要使用套件及其相依項目,即表示您接受其授權合約。如果您不接受授權合約,請將相關元件從您的裝置中刪除。
已經成功安裝 'EntityFramework 5.0.0'。
安裝失敗。正在復原...
Install-Package : 更新 'EntityFramework 6.0.2' 至 'EntityFramework 5.0.0' 失敗。找不到與 'EntityFramework 5.0
.0' 相容的 'EntityFramework.zh-Hans' 版本。
位於 行:1 字元:16
+ Install-Package <<<< EntityFramework -Version 5.0.0
+ CategoryInfo : NotSpecified: (:) [Install-Package], InvalidOperationException
+ FullyQualifiedErrorId : NuGetCmdletUnhandledException,NuGet.PowerShell.Commands.InstallPacka
geCommand
2. Entity Framework遷移不會造成混亂和數據丟失嗎
注意事項如下:
1. 分頁的時候,盡量在資料庫裡面去分頁.
2. 盡量禁用延遲載入,盡量使用預載入和顯式載入查詢.
如果啟用延遲載入,這樣會造成多次往返資料庫查詢的.勢必造成性能低下.
3. 注意事務的簡短性.
在使用事務時,要盡量把查詢語句或者其他響事務外的語句移在事務外執行.不然讓一個事務的時間太長了,就容易引起資源死鎖的問題.
4. 查詢出來的實體,如果不考慮刪除和修改,請用notracking
5. 批量刪除和修改,不要用先把實體查詢出來,然後再逐個刪除和修改.這樣會產生大量的語句,效率肯定會低.
6. 使用已編譯的查詢,雖然到ef5.0, linq 查詢是自動緩存的.但使用編譯查詢會比自動緩存的效率高.
7. 對於復雜的查詢,要隨時監控生成的查詢語句.
畢竟ef生成的語句,往往比生成的語句更加復雜,這個時候就要考慮是否通過其他方式來提高性能.
3. hibernate二級緩存 和 spring整合的緩存(就是用哪個Cacheable註解的)有什麼區別么
二級緩存配置(spring+hibernate)
說明:本人不建議使用查詢緩存,因為查詢緩存要求完全相同的查詢sql語句才會起作用,所說的查詢緩存是針對第二次查詢時 sql語句與第一次sql語句完全相同 那麼就可以從緩存中取數據而不去資料庫中取數據了,在不啟用查詢緩存的情況下 每次的查詢數據也會緩存到二級緩存的 只不過每次查詢都會去查詢資料庫(不包括根據ID查詢),啟用查詢緩存很麻煩 需要每次查詢時 調用Query.setCacheable(true)方法才可以,如:List<OrgiData> orgiDatas = (List<OrgiData>) s.createQuery("from OrgiData").setCacheable(true).list();
因此建議將查詢緩存設置為如下:
hibernate.cache.use_query_cache=false
還有就是最重要的一點:對於經常修改或重要的數據不宜進行緩存,因為多並發時會造成數據不同步的情況。
首先增加ehcache-1.4.1.jar和backport-util-concurrent-3.1.jar或oscache-2.1.jar
一、spring配置
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mappingResources">
<list>
<value>com/handpay/core/merchant/bean/MerchGroupBuy.hbm.xml
</value>
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.SQLServerDialect
hibernate.show_sql=true
hibernate.format_sql=true
hibernate.hbm2ddl.auto=update
hibernate.cache.use_second_level_cache=true
hibernate.cache.use_query_cache=false
hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider </value>
</property>
</bean>
<!---紅色字體是二級緩存相關的設置->
二、hbm.xml文件示例
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.handpay.core.merchant.bean">
<class name="MerchGroupBuy" table="merch_group_buy">
<cache usage="read-write" region="com.handpay.core.merchant.bean.MerchGroupBuy"/>
<id name="id">
<generator class="native" />
</id>
<property name="code" />
<property name="createTime"/>
<property name="minNum"/>
<property name="status">
</property>
<property name="title"/>
<property name="typeCode"/>
<property name="updateTime"/>
</class>
</hibernate-mapping>
三、註解示例
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
@Table(name = "alcor_t_countries", catalog = "alcorweb")
public class AlcorTCountries implements java.io.Serializable{。。。。}
四、配置文件參數詳解
ehcache.xml是ehcache的配置文件,並且存放在應用的classpath中。下面是對該XML文件中的一些元素及其屬性的相關說明:
<diskStore>元素:指定一個文件目錄,當EHCache把數據寫到硬碟上時,將把數據寫到這個文件目錄下。 下面的參數這樣解釋:
user.home – 用戶主目錄
user.dir – 用戶當前工作目錄
java.io.tmpdir – 默認臨時文件路徑
<defaultCache>元素:設定緩存的默認數據過期策略。
<cache>元素:設定具體的命名緩存的數據過期策略。
<cache>元素的屬性
name:緩存名稱。通常為緩存對象的類名(非嚴格標准)。
maxElementsInMemory:設置基於內存的緩存可存放對象的最大數目。
maxElementsOnDisk:設置基於硬碟的緩存可存放對象的最大數目。
eternal:如果為true,表示對象永遠不會過期,此時會忽略timeToIdleSeconds和timeToLiveSeconds屬性,默認為false;
timeToIdleSeconds: 設定允許對象處於空閑狀態的最長時間,以秒為單位。當對象自從最近一次被訪問後,如果處於空閑狀態的時間超過了timeToIdleSeconds屬性值,這個對象就會過期。當對象過期,EHCache將把它從緩存中清空。只有當eternal屬性為false,該屬性才有效。如果該屬性值為0,則表示對象可以無限期地處於空閑狀態。
timeToLiveSeconds:設定對象允許存在於緩存中的最長時間,以秒為單位。當對象自從被存放到緩存中後,如果處於緩存中的時間超過了 timeToLiveSeconds屬性值,這個對象就會過期。當對象過期,EHCache將把它從緩存中清除。只有當eternal屬性為false,該屬性才有效。如果該屬性值為0,則表示對象可以無限期地存在於緩存中。timeToLiveSeconds必須大於timeToIdleSeconds屬性,才有意義。
overflowToDisk:如果為true,表示當基於內存的緩存中的對象數目達到了maxElementsInMemory界限後,會把益出的對象寫到基於硬碟的緩存中。注意:如果緩存的對象要寫入到硬碟中的話,則該對象必須實現了Serializable介面才行。
memoryStoreEvictionPolicy:緩存對象清除策略。有三種:
1 FIFO ,first in first out ,這個是大家最熟的,先進先出,不多講了
2 LFU , Less Frequently Used ,就是上面例子中使用的策略,直白一點就是講一直以來最少被使用的。如上面所講,緩存的元素有一個hit 屬性,hit 值最小的將會被清出緩存。
2 LRU ,Least Recently Used ,最近最少使用的,緩存的元素有一個時間戳,當緩存容量滿了,而又需要騰出地方來緩存新的元素的時候,那麼現有緩存元素中時間戳離當前時間最遠的元素將被清出緩存。
五 、查看 二級緩存數據
1、使用sessionFactory直接獲取
Map cacheEntries = sessionFactory().getStatistics()
.getSecondLevelCacheStatistics("cacheRegionName")
.getEntries();
其中 cacheRegionName 既是 ehcache.xml配置中的<cache 標簽的name屬性值
2、讓log4j列印緩存信息(生成環境下請注釋掉,以免影響性能)
log4j.logger.org.hibernate.cache=debug
4. entityframework where方法里的字元串比較怎麼寫
那個 提示下 Linq本身 確實可以實現 sql select... where in 操作 但是好像效率不太好
我個人排斥
直接給出答案
折集合對象 class myitem {
int id;
string name;
}
var myitemcollection = new myitem[]{ ....... };
//要找出 id 等於 1 ,2,3,4的元素(select * from T where id in(1,2,3,4));
int[] tosearch = new int[] { 1, 2, 3, 4 };
myitemcollection.where(s=>tosearch.Contains(s.id));// 就是你要的結果了
還有個偷巧的方法
如果你用 EntityFramework的話, 形如 dbcontextentities.myitemset.SQL(""); 逗地為sql原生語句,可以直接返回。。。。。 如果覺得實在想不出來linq怎麼寫的話
5. Entity Framework和ADO.Net兩個怎麼取捨
這個沒什麼不好取捨的,ado.net是Entity Framework的基礎,但不一定要用到項目中,如果你要學習,先學ado.net,在學Entity Framework比較好,在.net開發中,所有的orm都是基於ado.net的,所以,學就對了。
至於使用方面,還得看你想不想提高效率,Entity Framework開發效率很高的,就是用不好會很慢,學習起來也慢。
6. Entity Framework於ADO.Net相比有什麼優勢
快速開發,大大的減少了代碼量。不用定義實體類那些東西了。直接與資料庫中模型結合起來了,我也只知道一點,用過一點。很好學的,不過得先學LINQ哦。
7. 如何使用entityframework
先簡單說一下如何創建環境。如果你對這些步驟了如指掌,請直接跳過。
1. 在Visual Studio中創建一個示例工程。最簡單的莫過於ConsoleApplication
2. 在工程中添加ADO.NET Entity Data Model。
選擇其中的兩個表作為示例,表Teacher和表Course
添加edmx之後,Visual
Studio為自動幫我們生成/添加所有需要的文件和內容,然後我們就可以開始在代碼中操作資料庫了。來看看在EF中幾種不同的數據載入方式。
惰性載入(Lazy Loading)
默認情況下,EF會使用惰性載入方式載入數據,即ctx.Configuration.LazyLoadingEnabled = true;
在下面的代碼中,外層循環會執行一次查詢,並將返回的結果存放在變數q中。而內層循環會在每一次循環過程中獨立進行查詢,所以,如果資料庫表Teacher中有100條記錄而Course有1000條記錄,那麼整個過程將產生1001次查詢。
using (var ctx = new SchoolDBEntities())
{
var q = from t in ctx.Teachers
select t;
foreach (var teacher in q)
{
Console.WriteLine("Teacher : {0}", teacher.TeacherName);
Console.WriteLine("Respective Courses...");
foreach (var course in teacher.Courses)
{
Console.WriteLine("Course name : {0}", course.CourseName);
}
Console.WriteLine();
Console.ReadKey();
}
}
8. c#怎麼使用entityframework6連接sql server
private static string conStr =「」;//鏈接字元串
using (SqlConnection sqlCon = new SqlConnection(conStr))
{
using (SqlCommand cmd = new SqlCommand(sqlStr, sqlCon))//sqlstr 是sql語句
{
if (sq != null)
{
cmd.Parameters.AddRange(sq);
}
//打開連接
sqlCon.Open();
return cmd.ExecuteNonQuery();
}
}
可以進行增刪改查
9. 什麼是Entity Framework
Entity Framework主要是把關系型資料庫也就是Sqlserver那些轉化一下,讓程序員在寫C#的代碼的時候,能用類的方式來操作資料庫,而不是用sql字元串。
我們可以把它用用C/S的工程當中,也可以把它用到 B/S的工程當中。為了展示EntityFramework的使用方法,我們首先得建立一個例子解決方案。這個解決方案的最基礎的普通三層結構,因為數據的訪問主要靠EntityFramework來實現,所以數據訪問層的實現基本看不出來了,使得整個解決方案好像就是個兩層的一樣。