Как правильно использовать Entity Framework? - PullRequest
1 голос
/ 10 ноября 2010

У меня есть такая БД, которую я сгенерировал из EF: alt text

Теперь я хотел бы добавить сущность "fielduserinput", чтобы я написал следующий код:

    public bool AddValueToField(string field, string value, string userId)
    {
        //adds a value to the db
        var context = new DBonlyFieldsContainer();
        var fieldSet = (from fields in context.fieldSet
                        where fields.fieldName.Equals(field)
                        select fields).SingleOrDefault();
        var userSet = (from users in context.users
                       where users.id.Equals(userId)
                       select users).SingleOrDefault();

        var inputField = new fielduserinput { userInput = value, field = fieldSet, user = userSet };
        return false;
    }

Очевидно, что он еще не закончен, но я думаю, что он передает то, что я делаю.

Это действительно правильный способ сделать это? Моя цель - добавить в fielduserinput строку, содержащую значение и ссылки на пользователя и поле. Кажется немного утомительным делать это таким образом. Я представляю что-то вроде:

public bool AddValueToField(string userId, string value, string fieldId)
{
    var context = new db();
    var newField = { field.fieldId = idField, userInput = value, user.id = userId }
    //Add and save changes
}

1 Ответ

2 голосов
/ 11 ноября 2010

Для старых версий 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.

Еще один момент, о котором следует помнить, это то, что этот уровень конфигурации не является необходимым.Первый код можно использовать вообще без какой-либо конфигурации, если вы придерживаетесь стандартов, указанных в первом наборе публикаций, на которые ссылаются.Он не создает самые красивые имена в базе данных, но работает.

Не очень хороший ответ, но я решил поделиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...