2013-08-30 38 views
0

我正在使用EntityFramework将项目版本号保存到数据库 。在UI页面中,用户键入版本(主要,次要,构建)整数值并单击保存按钮 在I保存,我想确保在数据库中没有创建重复版本。实体框架如何防止重复项进入db

什么,我想是确保major.minor.build组合是唯一

ProjVersion newVersion=new ProjVersion(); 
newVersion.Major=10; 
newVersion.Minor=1; 
newVersion.Build=1; 
this.repository.Add<ProjVersion>(newVersion); 
//here how can I ensure that no duplicate versions are added to database 
this.repository.SaveChanges(); 

[Serializable] 
    public class ProjVersion 
    { 
     [Key] 
     public int Version_Id { get; set; } 
     public int Major { get; set; } 
     public int Minor { get; set; } 
     public int Build { get; set; } 
    } 

回答

0

检查是否有数据库具有相同的细节,你想添加什么样的任何条目。如果没有,那么这是一个新版本,你应该添加它,如果是的话,那么它是一个重复的,你应该做任何你想要处理的情况。

if (repository.Get(x => x.Major == newVersion.Major && 
    x.Minor == newVersion.Minor && x.Build == newVersion.Build) 
    .Count() > 0) 
{ 
    //notify the user that they are making a duplicate entry 
} 
else 
{ 
    repository.SaveChanges(); 
} 
+1

并在其周围添加“使用(TransactionScope tsTransScope = new TransactionScope())”。 – Ubikuity

+0

version_id是一个自动生成的数字。因此每次添加新记录时,它都会生成一个新的数字作为version_id。但这里我正在尝试确保major.minor.build组合是唯一的 – Millar

+0

@Millar,是啊,这是我的错误。它已被编辑,现在显示正确的代码。 –

0

这听起来像你需要使用Compound Key,所有的属性(列)主键的一部分。

{ 
    [Key, Column(Order = 0)] 
    public int Major { get; set; } 

    [Key, Column(Order = 1)] 
    public int Minor { get; set; } 

    [Key, Column(Order = 2)] 
    public int Build { get; set; } 
} 

尝试使用匹配键插入记录将产生一个Exception

+0

虽然这样可以达到不允许重复条目的预期结果,但它也会带来复合主键的复杂性,例如不允许修改任何这些字段。 –

+0

如果这是用于版本规划的话,我可以看到在更改'Version'时的用法,但是如果它代表内置版本(我认为这是因为它包含'Build'属性),那么为什么要更改版本呢?这将是一个不同的版本 - 不是吗? – STW

+0

如果没有完整的项目规范,我们无法确定,但人们会犯错误。如果他们意外地将10.1.1版本输入为10.1.2,那么将无法更改删除该行的那一短。如果这个项目不允许删除呢?那么它必须保持在那里,当它们真正到达版本10.1.2时会发生什么? –