?
快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

網賭新浦金可靠嗎:Asp.net MVC更新ModelFirst Entity Framework POCO實體外鍵實例

?

EF4.1支持了純摯的POCO實體,對編寫Persistence-Ignorant 的法度榜樣很有贊助。EF4.1還支持Code First的開拓要領,但小我感到使用Code First在處置懲罰較為繁雜的關聯的時刻照樣力不從心,Model First是加倍相宜的要領。在MVC利用法度榜樣中,因為無法長久的保留DbContext,在更新一個實體的時刻,平日的場景是這樣的:

ActionResult Edit(Entity entity)

{

//Init a context

// code to update entity

}

在這種環境下,EF自帶的ChangeTracker都起不到任何感化。要是我們有如下模型:

EF會天生如下的兩個實體類:

public partial class Person

{public int Id { get; set; }

public string Name { get; set; }

public virtual Address Address { get; set; } }

public partial class Address {

public Address(){

this.Person = new HashSet

();}

public int Id { get; set; }

public string Name { get; set; }

public virtual ICollection

Person { get; set; } }

看起來很完美,然則我們在更新Person的時刻會碰到麻煩,例如:

static void Main(string[] args)

{var p = new Person { Id = 1, Name = "hello2", Address = new Address { Id = 2 } };

Update(p); }

staticbool Update(Person p)

{using (EFContainer con = new EFContainer())

{con.Entry

(p).State = System.Data.EntityState.Modified;

co網賭新浦金可靠嗎n.SaveChanges();}

return true; }

運行的結果是:

Na網賭新浦金可靠嗎me屬性被改動了,然則外鍵沒有被改動。

改網賭新浦金可靠嗎成這樣:

staticbool Update(Person p)

{using (EFContainer con = new EFContainer())

{p.Address = con.AddressSet.Find(p.Address.Id);

con.Entry

(p).State = System.Data.EntityState.Modified;con.SaveChanges();

}return true;

}

結果照樣一樣。EF的行徑被設計成這樣很令人費解。所幸還有一種措施可以辦理這個問題,便是顯式的在Person類中添加Address的外鍵。詳細措施是,在EDMX設計器中,給Person類添加一個Scalar Prope網賭新浦金可靠嗎ry,AddressID,在Table Mapping中,將其設置為AddressSet的ID,如下圖:

著末,雙擊表示關聯的線條,彈出一個外鍵約束框,如下設置:

設置完成今后,就可以如下應用:

static void Main(string[] args)

{var p = new Person { Id=1, Name = "modified", AddressID=2 };

Update(p); }

staticbool Update(Person p)

{using (EFContainer con = new EFContainer())

{con.Entry

(p).State = System.網賭新浦金可靠嗎Data.EntityState.Modified;

con.SaveChanges();}

return true; }

統統正常。

純摯從設計的角度來說,在實體類中裸露外鍵——一個在關系數據庫中存在的觀點并不是一個很好的設計措施,然則,今朝彷佛僅能經由過程這種措施使得EF能夠精確處置懲罰外鍵的更新,并且,在某些環境下,裸露外鍵也可以獲得一些方便,暫且就這樣吧。

在新增實體的時刻,假如不裸露外鍵,也會有各種問題,例如:

static void Main(string[] args)

{var p = new Person { Name = "hello5", Address = new Address { Id = 1, Name = "China" } };

Create(p); }

static bool Create(Person p)

{using (EFContainer con = new EFContainer())

{con.PersonSet.Add(p);

con.SaveChanges();}

return true; }

這代碼可以精確運行,然則結果并不是期望的新建一個名字為hello5的Person,其Address為ID=1的Address,事實上,EF會輕忽掉落Address中的Id=1,新增一個名字為China的Address,再將這個新增的Address的Id和這個Person關聯起來。這樣的行徑也很費解,小我覺得在顯式指定Address的主鍵的時刻就不應該再去試圖新建Address實體,而應該直接關聯,反之,當沒有指定Address的主鍵的時刻,應該新建一個。

不管若何,假如有了顯式的外鍵,那么,在必要關聯到已有的工具的時刻,就直接應用AddressID來設置,否則就應用new Address來設置。

免責聲明:以上內容源自網絡,版權歸原作者所有,如有侵犯您的原創版權請告知,我們將盡快刪除相關內容。

您可能還會對下面的文章感興趣:

快三平台开户