C# 使用实体框架的正确方法是什么?

C# 使用实体框架的正确方法是什么?,c#,entity-framework,ado.net,C#,Entity Framework,Ado.net,我有一个这样的DB,我从EF生成: 现在我想添加一个“fielduserinput”实体,因此我编写以下代码: public bool AddValueToField(string field, string value, string userId) { //adds a value to the db var context = new DBonlyFieldsContainer(); var fieldSet = (from

我有一个这样的DB,我从EF生成:

现在我想添加一个“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添加一行,其中包含对user和field的值和引用。这样做似乎有点乏味。我在想象这样的事情:

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
}

对于EF的旧版本,我认为您或多或少都在做需要做的事情。这是我直到最近才觉得EF准备好的众多原因之一。我将展示一个场景,我们必须给你另一个选择

我们在EF 4 CTP中使用了这种方法。如果这个改变足够重要,请继续阅读,等待其他答案(因为飞天怪兽知道我可能错了),然后决定是否升级。请记住,这是一个CTP而不是RC,因此可能会有相当大的变化。但是如果你开始编写一个新的应用程序,我强烈建议你在写得太远之前先阅读一些关于它的内容

使用代码优先的方法,可以创建包含对另一个模型的引用属性和另一个模型的id属性(User&UserId)的模型。正确配置后,为引用或id设置值将在数据库中正确设置id

参加下面的课程

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完整配置的示例

另一点要记住的是,这种级别的配置是不必要的。如果您坚持在引用的第一组帖子中指定的标准,那么CodeFirst可以在没有任何配置的情况下使用。它不会在数据库中创建最漂亮的名称,但它可以工作


这不是一个很好的答案,但我想我会与大家分享。

谢谢!有趣的链接。我正在开发一个新的应用程序,它很快就会投入生产,所以我将坚持旧的方法,因为我对这种方法一点也不熟悉。虽然它看起来很甜,但我会留意的。再次感谢