代码之家  ›  专栏  ›  技术社区  ›  Phil

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

  •  1
  • Phil  · 技术社区  · 15 年前

    我有一个这样的数据库,我从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 回复  |  直到 15 年前
        1
  •  2
  •   Chuck    15 年前

    对于旧版本的英孚,我认为你或多或少在做需要做的事情。这是我觉得英孚直到最近才准备好的众多原因之一。我要给你安排另一个选择。

    我们使用 code first EF4 CTP中的方法。如果这个更改足够重要,请继续阅读,等待其他答案(因为飞行的斯皮盖特怪兽知道我可能是错的),然后决定是否升级。请记住,这是一个CTP而不是一个RC,所以可能会有相当大的变化。但是,如果你开始写一个新的应用程序,我强烈建议你在写得太远之前先阅读一下。

    使用代码优先方法,可以创建包含引用另一个模型的属性和另一个模型的ID(用户和用户ID)的属性的模型。正确配置后,为引用或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();
    }
    

    …反之亦然,属性和数据库中的所有内容都会正常工作。这是一个 great post 完全配置EF。

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

    不是很好的答案,但我想我会分享。