Ssw*_*wan 7 asp.net-mvc-4 entity-framework-5
使用.NET 4,MVC 4,Entity Framework 5,SQL Server;
我想在一个事务中插入一个新的Header记录和几个新的HeaderData记录,它们都有一个外键到插入的Header记录.标头记录具有Identity int主键.
Entities.Header h = new Entities.Header();
h.Name = name;
h.Time = DateTime.Now;
h.Comments = comments;
db.Headers.Add(h);
// db.SaveChanges(); // Save changes here?
// and get ID to use below via h.ID?
foreach (DataRecord dr in datarecords) // my own custom types here
{
Entities.HeaderData hd = new Entities.HeaderData();
// hd.header = thisid // ?? this is the FK to Header.ID, its Identity int PK
hd.name = dr.name
hd.value = dr.value
db.HeaderDatas.Add(hd)
}
db.SaveChanges(); // or wait to save all here?
Run Code Online (Sandbox Code Playgroud)
所以问题是,我不知道在提交之前,将头记录ID放入数据记录的FK字段中是什么.或者我呢?只是在SaveChanges/Commit不起作用之前引用h.ID,它返回0.
选项:1)我应该首先提交头记录,获取要使用的PK,然后填充数据记录模型并单独提交它们吗?在这种情况下,可能必须对标题进行回滚,这听起来像是不太理想的方式.
2)我应该使用GUID PK或类似的,我在应用程序中创建它吗?这是唯一可以添加记录的地方.
3)实体框架中是否有一个灵巧的方式(临时的EntityKey可能?),并让它进行事务插入,以便它自动将正确的标头ID放入数据记录的FK字段中?这似乎可以用于EF,但我无法找到它的引用.
如果Header并且HeaderData与外键(一对多)关系相关,则应在其中包含导航集合Header.HeaderDatas(类型ICollection<HeaderData>或其他集合类型)Header或导航引用HeaderData.Header(类型Header),HeaderData甚至两者.
在任何一种情况下,更好的方法是使用这些导航属性建立关系:
Entities.Header h = new Entities.Header();
h.HeaderDatas = new List<HeaderData>();
// ...
foreach (DataRecord dr in datarecords)
{
Entities.HeaderData hd = new Entities.HeaderData();
//...
h.HeaderDatas.Add(hd)
}
db.Headers.Add(h);
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
要么:
Entities.Header h = new Entities.Header();
// ...
foreach (DataRecord dr in datarecords)
{
Entities.HeaderData hd = new Entities.HeaderData();
//...
hd.Header = h;
db.HeaderDatas.Add(hd);
}
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
您无需直接设置FK.EF将正确地"转换"您设置的导航属性到数据库表的必要外键值.
| 归档时间: |
|
| 查看次数: |
7506 次 |
| 最近记录: |