Для старых версий EF, я думаю, вы делаете более или менее то, что нужно сделать.Это одна из многих причин, почему я не чувствовал, что EF был готов до недавнего времени.Я собираюсь изложить сценарий, который мы должны дать вам другой вариант.
Мы используем код сначала подход в EF 4 CTP.Если это изменение достаточно важно, читайте дальше, дождитесь других ответов (потому что Flying Speghetti Monster знает, что я могу ошибаться), а затем решите, хотите ли вы обновить.Имейте в виду, что это CTP, а не RC, поэтому могут произойти значительные изменения.Но если вы начинаете писать новое приложение, я настоятельно рекомендую прочитать о нем, прежде чем заходить слишком далеко.
При подходе кода сначала можно создавать модели, содержащие свойства для ссылки на другоемодель и свойство для идентификатора другой модели (User & UserId).При правильной настройке установка значения для ссылки или идентификатора приведет к правильной установке идентификатора в базе данных.
Возьмите следующий класс ...
public class FieldUserInput{
public int UserId {get;set;}
public int FieldId {get;set;}
public virtual User User {get;set;}
public virtual Field Field {get;set;}
}
... и конфигурацию
public class FieldUserInputConfiguration{
public FieldUserInputConfiguration(){
MapSingleType(fli => new {
userid = fli.UserId,
fieldid = fli.FieldId
};
HasRequired(fli => fli.User).HasConstraint((fli, u)=>fli.UserId == u.Id);
HasRequired(fli => fli.Field).HasConstraint((fli, f)=>fli.FieldId == f.Id);
}
}
Вы можете написать код ...
public void CreateField(User user, int fieldId){
var context = new MyContext();
var fieldUserInput = new FieldUserInput{ User = user, FieldId = fieldId };
context.FieldUserInputs.Add(fieldUserInput);
context.SaveChanges();
}
... или наоборот со свойствами, и все будет хорошо работать в базе данных.Вот отличный пост о полной конфигурации EF.
Еще один момент, о котором следует помнить, это то, что этот уровень конфигурации не является необходимым.Первый код можно использовать вообще без какой-либо конфигурации, если вы придерживаетесь стандартов, указанных в первом наборе публикаций, на которые ссылаются.Он не создает самые красивые имена в базе данных, но работает.
Не очень хороший ответ, но я решил поделиться.