2013-12-09 75 views
2

我在与实体框架5和MVC C#4实体框架增加了重复实体数据库

我有一个模型(医疗)“测量”具有以下属性的一个问题:

[DataMember] 
public int ID { get; set; } 

[Required] 
[DataMember(IsRequired = true)] 
[Column(TypeName = "DateTime2")] 
public DateTime Date { get; set; } 

[Required] 
[DataMember(IsRequired = true)] 
public Status Status { get; set; } 

[Required] 
[DataMember(IsRequired = true)] 
public User User { get; set; } 

[Required] 
[DataMember(IsRequired = true)] 
public virtual List<Result> Results { get; set; } 

该模型的结果是这样的:

[DataMember] 
public int ID { get; set; } 

[DataMember] 
public int Revision { get; set; } 

[DataMember] 
public string Comment { get; set; } 

[DataMember] 
public string ValueString { get; set; } 

[DataMember] 
public int ValueInt { get; set; } 

[Required] 
[DataMember] 
public virtual MeasurementType MeasurementType { get; set; } 

和模型MeasurementType(如长度,年龄,性别,血压)是:

public int ID { get; set; } 

[Required] 
[DataMember] 
public string Name { get; set; } 

[DataMember] 
public string Unit { get; set; } 

我有一个与DbContext连接的Repository。当我想添加一个新的测量时,测量类型,用户,公司和角色(都在用户中)也被添加到数据库中,但它们已经存在于数据库中。结果是,有很多MeasurementType的副本和用户

的这是添加新的测量方法:

public void Post(Measurement measurement) 
{ 
    db.Measurements.Add(measurement); 
    db.SaveChanges(); 
} 

我知道这个问题,Measurement.User和Result.MeasurementType的EntityState有将被替换而不是添加,但我无法使它们保持不变。 我已经尝试了几个解决方案,就像Attach(Measurement.MeasurementType)一样在这里发现,但是这给了我一个像“ObjectStateManager中已经有一个对象具有相同的键”的错误。

我做错了什么?它是Measurement和MeasurementType(多对多)之间的模型还是关系,还是存储库方法中的错误,还是使用关键字“虚拟”不是最好的方法?

+0

你是如何生成你的ID的? –

+0

@ User3805967它们是由Entity Framework自动生成的。 – Pino112

+1

为什么实体框架将现有对象重新插入到我的数据库中? msdn.microsoft.com/en-us/magazine/dn166926.aspx – Colin

回答

2

你必须明确地创建外键,例如:

public int UserId { get; set; } 
public virtual User User { get; set; } 

然后,你可以这样做:

User u = GetUserById(1); 
myMeasurement.UserId = u.Id;