1

这是我在 C# MVC 项目中的模型类。我想将会员 ID 设置为唯一字段?

public class Customer
{
        public int CustomerID { get; set; }
        public string MembershipID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string EmailAddress { get; set; }
}
4

3 回答 3

1

实体框架不支持属性的唯一性,因此我们必须为此创建一个函数。我建议你使用FluentValidation,它很容易掌握

public class Customer
{
        public int CustomerID { get; set; }
        public string MembershipID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string EmailAddress { get; set; }
}

您可以通过继承来为此类定义一组验证规则

    using FluentValidation;

    public class CustomerValidator : AbstractValidator<Customer> {

    public CustomerValidator() {
        RuleFor(customer => customer.EmailAddress).NotNull().Must(UniqueAddmail);
      }

   public bool UniqueAddmail (string EmailAddress)
        {
            return new AnnuaireDbEntities().Wilaya.FirstOrDefault(x => x.Nom == EmailAddress) == null;
        }
    }
于 2019-05-01T22:54:56.917 回答
0

我只能猜测,因为你没有提到你班上的钥匙是什么。

实体框架不支持unique根据 DataAnnotations 的列。您唯一能做的就是将一列设置为主键,并将另一列作为 Guid 的 ID 列。

假设CustomerID是您的主键:

using System.ComponentModel.DataAnnotations;

public class Customer
{
    [Key]
    public int CustomerID { get; set; }
    public Guid MembershipID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string EmailAddress { get; set; }
}

假设您的 MembershipID 是您的主键:

using System.ComponentModel.DataAnnotations;

public class Customer
{

    public Guid CustomerID { get; set; }
    [Key]
    public int MembershipID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string EmailAddress { get; set; }
}

通过将其中一列设为 guid,您生成 2 个相同值的键的机会几乎为零。

于 2013-10-21T06:47:00.510 回答
0
public class Customer
{
    public int CustomerId { get; set; }
    public string MembershipId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string EmailAddress { get; set; }
}

public class Company
 {
     public string MembershipId { get; set; }
     public string Name {get; set;}

 }
public class CustomersBankAccount
 {
   public string Name {get; set;}
   public int CustomerId { get; set; }
 }

当您想使用代码优先约定构建数据库时,约定是在您的属性中集成一个“Id”(外键)部分。当然,我建议将所有属性声明为虚拟,以便 EF 可以掌握您的代码并启用某些功能。就像一个高效的跟踪机制

所以:如果您在名为 ID 的对象上有一个属性,EF 假定该属性包含主键值并在 SQL Server 中设置一个自动递增(标识)键列来保存该属性值。

编辑:

“在对象上”是指客户的对象。本质上,您的示例中的主键在 customer 中,外键在与 customer 相关的所有其他表中。主键不能重复或为空。外键 - 是的。同一客户可能有多个银行账户。:) 因此,如果您想知道设置钥匙的管道在哪里,请停下来。MVC 可以只查看上面的代码并决定(在脚手架选择上)如何在数据库中制作表格。除了您已经看到的内容(“Id”和结尾)之外,您不必在代码中指明任何内容

根据我的评论编辑:

  public class Customer
{
    public int CustomerId { get; set; }
    [Remote("CheckMembershipIdActionMethod", "CorrespondingController")]
    public string MembershipId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string EmailAddress { get; set; }
}
于 2013-10-21T06:48:49.507 回答