我有一个这样的数据库,我是从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添加一行,其中包含值和对用户和字段的引用。这样做似乎有点乏味。我想象的是:
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
}
答案 0 :(得分:2)
对于旧版本的EF,我认为您正在或多或少地做着需要做的事情。这是我直到最近才意识到EF已经准备就绪的众多原因之一。我将列出我们必须给你另一种选择的方案。
我们在EF 4 CTP中使用code first方法。如果这个变化非常重要,请继续阅读,等待其他答案(因为Flying Speghetti Monster知道我可能错了),然后决定是否要升级。请记住,这是一个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完整配置的great post。
要记住的另一点是,这种配置级别不是必需的。如果您坚持引用的第一组帖子中指定的标准,则可以首先使用代码而无需任何配置。它不会在数据库中创建最漂亮的名称,但它可以工作。
不是很好的答案,但我想分享。