Entity Framework creates foreign key objects instead of using those that are already available

回眸只為那壹抹淺笑 提交于 2019-11-28 16:46:30

问题


my current project is based on Entity Framwork code-first. I have three types: Task, TaskType and Module.

    public class Task
    {
        public int ID { get; set; }
        public Module Module { get; set; }
        public TaskType Type { get; set; }
    }

    public class TaskType
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }

    public class Module
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }

There are foreign key relations defined inside the table for the Task-type.

My problem is that when I try to create a new Task-object linked to already available TaskType and Module objects (ID = 1), those objects are created as new rows in their corresponding tables.

        TaskRepository repo = new TaskRepository();

        Task task = new Task();
        task.Module = Modules.SingleOrDefault(m => m.ID == 1);
        task.Type = TaskTypes.SingleOrDefault(t => t.ID == 1);

        Tasks.Add(task);

This creates a new row in my TaskType-table and in my Modules-table as well instead of just using the already available TaskType-ID and Module-ID.

I hope I made clear what my problem is ;-)

Thanks in advance for your help. I appreciate it.

Regards, Kevin


回答1:


If you don't use the same context instance to load related entities you cannot simply add them to the new entity and expect that existing records in the database will be used. The new context doesn't know that these instances exist in the database - you must to say it to the context.

Solutions:

  1. Use the same context for both loading related entities and saving new entity
  2. Don't load related entities and use dummy objects
  3. Load entities from the first context and detach them, attach entities to a new context and after that assign them to a new entity.
  4. After adding a new entity with relations manually change state of relations from Added to Unchanged

Example for 1:

var module = context.Modules.SingleOrDefault(m => m.ID == 1);
var taskType = context.TaskTypes.SingleOrDefault(t => t.ID == 1);

Task task = new Task();
task.Module = module;
task.Type = taskType;

context.Tasks.Add(task);

Example for 2:

var module = new Module { Id = 1 };
var taskType = new TaskType { Id = 1 };

context.Modules.Attach(module);
context.TaskTypes.Attach(taskType);

Task task = new Task();
task.Module = module;
task.Type = taskType;

context.Tasks.Add(task);

Example for 3:

var module = otherContext.Modules.SingleOrDefault(m => m.ID == 1);
otherContext.Entry(module).State = EntityState.Detached;

var taskType = otherContext.TaskTypes.SingleOrDefault(t => t.ID == 1);
otherContext.Entry(taskType).State = EntityState.Detached;

context.Modules.Attach(module);
context.TaskTypes.Attach(taskType);

Task task = new Task();
task.Module = module;
task.Type = taskType;

context.Tasks.Add(task);

Example for 4:

var module = otherContext.Modules.SingleOrDefault(m => m.ID == 1);
otherContext.Entry(module).State = EntityState.Detached;

var taskType = otherContext.TaskTypes.SingleOrDefault(t => t.ID == 1);
otherContext.Entry(taskType).State = EntityState.Detached;

Task task = new Task();
task.Module = module;
task.Type = taskType;

context.Tasks.Add(task);

context.Entry(module).State = EntityState.Unchanged;
context.Entry(taskType).State = EntityState.Unchanged;



回答2:


I'm new to entity framework but I just ran into the same issue, where my foreign key property was populated but the navigation object was null, with code like:

public class EntryRecord
{        
    [Key]
    public int Id { get; set; }
}
public class QueueItem 
{       
    [Key]
    public int Id { get; set; }


    public int EntryRecordId { get; set; }

    [ForeignKey("EntryRecordId")]
    public EntryRecord EntryRecord { get; set;}

}

Setting the navigation property to virtual fixes the problem and enables lazy loading :

    [ForeignKey("EntryRecordId")]
    public virtual EntryRecord EntryRecord { get; set;}


来源:https://stackoverflow.com/questions/6249837/entity-framework-creates-foreign-key-objects-instead-of-using-those-that-are-alr

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!