C# 使用实体框架的正确方法是什么?
我有一个这样的DB,我从EF生成: 现在我想添加一个“fielduserinput”实体,因此我编写以下代码: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
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可以在没有任何配置的情况下使用。它不会在数据库中创建最漂亮的名称,但它可以工作
这不是一个很好的答案,但我想我会与大家分享。谢谢!有趣的链接。我正在开发一个新的应用程序,它很快就会投入生产,所以我将坚持旧的方法,因为我对这种方法一点也不熟悉。虽然它看起来很甜,但我会留意的。再次感谢