如何插入实体框架中尚不存在的外键?

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,但我无法找到它的引用.

Sla*_*uma 9

如果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将正确地"转换"您设置的导航属性到数据库表的必要外键值.