使用EF Code First,如何在创建对象时指定ID?

时间:2011-10-10 23:16:43

标签: c# entity-framework-4.1

我有以下对象:

public class User {
    int Id { get; set; }
    string Name { get; set; }
    IList<Job> Jobs { get; set; }
}

public class Job {
    int Id { get; set; }
    DateTime StartTime { get; set; }   // other fluff values here
    User User { get; set; }
}

我已经在UserJob之间设置了多对多关系(因为它是合适的),但我想在创建它们时指定Job.Id。我可以保证,虽然可能实体不能,但是ID是唯一的,因为它们是另一个系统中另一个表的PK。

以下代码说明了我想要的工作:

var user = db.Users.Create ();
var job = new Job();
job.Id = 42; // id from other service
user.Jobs.Add (job);

db.Users.Add (user);
db.Save ();

为简洁起见,省略了一些代码,如果我省略了必要的内容,请告诉我。我的User被创建并插入,我的Job被创建并插入,但Job.Id是1而不是42。

我错过了什么?

1 个答案:

答案 0 :(得分:5)

public class Job {
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    int Id { get; set; }
    DateTime StartTime { get; set; }   // other fluff values here
    User User { get; set; }
}

应该做你需要的。

来自DataAnotations

  

将列上的DatabaseGeneratedAttribute设置为Identity或   Computed强制从中检索列的值   调用SaveChanges时,服务器作为标识或计算值。   类型为时,将从数据源中读取标识属性   首先保存,但之后,它们被假定为不变。计算   每次调用SaveChanges时都会读取属性。 无表示   它不是服务器生成的属性。标识是默认值   使用Code First时整数键属性的值。

DatabaseGenerated reference