1

设置

考虑以下数据表:

*Files*
| PK_File_ID | Name |


*FileStatusLog*
| (Key) FK_File_ID | (Key) FK_Status_ID | (Key) Date |

*FileStatus*
| PK_Status_ID | Name |

上表由以下 Code First 对象表示:

public class File
{
    [Key]
    public int Id{ get; set; }
    public string Name {get;set}

    public virtual List<FileStatusLog>
}

public class FileStatusLog
{
    [Column(Order = 0), Key, ForeignKey("File")]
    public int Fk_File_Id { get; set; }
    [Column(Order = 1), Key, ForeignKey("Status")]
    public int Fk_Status_Id { get; set; }
    [Column(Order = 2), Key]
    public DateTime Date { get; set; }
    public virtual File File { get; set; }
    public virtual FileStatus Status { get; set; }
}

public class FileStatus
{
    [Key]
    public int Id{ get; set; }
    public string Name { get; set; }
    public virtual List<FileStatusLog> StatusEntries { get; set; }
}

问题

插入断开连接的文件时出现我的问题。我意识到这是在实体框架中插入断开连接的对象图的心爱的任务,仍然是一个痛苦的考验,但我之前已经能够做到。我想是多对多的关系让我失望了。

如果我不对文件做任何事情,只是插入它,它会尝试添加FileStatus. 这是插入断开连接的对象图的预期副作用。解决方法是确保每个FileStatus都映射到数据上下文:

public File Insert(File FileToInsert)
{
    for (int i = 0; i < FileToInsert.FileStatusLog.Count; i++)
    {
        var Entry = context.Statuses.Find(FileToInsert.FileStatusLog[i].FileStatus.Id);
        if (Entry != null)
        {
            Entry = Mapper.Map(FileToInsert.FileStatusLog[i].FileStatus, Entry);
            FileStatusLog[i].FileStatus = Entry;
        }
    }
    context.Files.Add(FileToInsert);
    context.SaveChanges();
}

问题是上面的代码没有按预期工作。复合键表每个状态只允许 1 行。每当插入具有以前使用过的状态的新文件时,in 中的该行将FileStatusLog被新数据覆盖。File我将如何得到这个结果?什么都不做,它试图复制FileStatus表中的状态。尝试绑定这些状态,它不会让您Status_Id在连接表中插入 Duplicate 。

关于这里发生了什么的任何想法?

4

0 回答 0