Enobong Adahada Ответов: 1

Универсальное свойство dbset<T> table name


Пожалуйста, как мне присвоить имя таблицы универсальной базе DBSet<t> на основе модели?
Я хочу создать таблицу для каждого зарегистрированного пользователя, используя его идентификатор пользователя и имя таблицы в EF6.

public class ContactModel
    {
        [Key]
        [Required]
        [MaxLength(20), MinLength(6)]
        public string Phone { get; set; }
        [MaxLength(45), MinLength(2)]
        public string Name { get; set; }
        [MaxLength(100)]
        public string Email { get; set; }
        
    }


Что я уже пробовал:

[Table("Logedin Userid")]
public class ContactModel
    {
        [Key]
        [Required]
        [MaxLength(20), MinLength(6)]
        public string Phone { get; set; }
        [MaxLength(45), MinLength(2)]
        public string Name { get; set; }
        [MaxLength(100)]
        public string Email { get; set; }
        
    }

1 Ответов

Рейтинг:
9

Richard Deeming

Это ужасная идея!

Создайте единую таблицу для ваших контактов и добавьте связь внешнего ключа с таблицей пользователей.

public class User
{
    [Key]
    public Guid Id { get; set; }
    
    public virtual IList<Contact> Contacts { get; set; }
    
    ... Other properties ...
}

public class Contact
{
    [Key]
    public Guid Id { get; set; }
    
    public Guid UserId { get; set; }
    
    public virtual User User { get; set; }
    
    [Required]
    [MaxLength(20), MinLength(6)]
    public string Phone { get; set; }
    
    [MaxLength(45), MinLength(2)]
    public string Name { get; set; }
    
    [MaxLength(100)]
    public string Email { get; set; }
}
Отношения, свойства навигации и внешние ключи - EF6 | Microsoft Docs[^]

Вы также захотите проверить свой [Key] определение - большинство систем допускают несколько контактов с одним и тем же телефонным номером, даже для одного и того же родительского объекта. Если вам действительно нужен уникальный телефонный номер для каждого пользователя, создайте составной ключ.
public class Contact
{
    [Key, Column(Order = 0)]
    public Guid UserId { get; set; }
    
    public virtual User User { get; set; }
    
    [Required]
    [MaxLength(20), MinLength(6)]
    [Key, Column(Order = 1)]
    public string Phone { get; set; }
    
    ... Other properties ...
}
Составные ключи - Code First Data Annotations - EF6 | Microsoft Docs[^]


Enobong Adahada

Спасибо за ответ,
На самом деле то, что я хочу сделать, это создать таблицу для каждого пользователя входа в систему, используя его идентификатор пользователя в качестве имени таблицы в БД, пожалуйста, как мне это сделать.
Еще раз спасибо.

Richard Deeming

И, как я уже сказал, это ужасная идея. Ваша база данных будет в абсолютном беспорядке, и полностью недоступна.

Есть причина, по которой Entity Framework не позволяет вам делать такие вещи.

Если вы абсолютно настаиваете на продолжении этой ужасной идеи, вам нужно будет использовать raw ADO.NET, и управлять запросами самостоятельно.

Enobong Adahada

Большое спасибо Ричарду за ваш ответ, я заглянул в него, это действительно плохая идея иметь несколько таблиц с одной и той же структурой.
Спасибо еще раз.