设置
考虑以下数据表:
*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 。
关于这里发生了什么的任何想法?