快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

和记娱乐在线官网: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自带的ChangeT和记娱乐在线官网racker都起不到任何感化。要是我们有如下模型:

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.Enti和记娱乐在线官网tyState.Modified;

con.SaveChanges();}

return true; }

运行的结果是:

Name属性被改动了,然则外键没有被改动。

改成这样:

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 Propery,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来设置。

您可能还会对下面的文章感兴趣: