Linq to sql, наследовать повторенный столбец - PullRequest
2 голосов
/ 17 марта 2011

все.У меня проблема с linq to sql.

Я использую атрибуты из System.Data.Linq.Mapping для сопоставления моих классов и таблиц.Я заметил, что некоторые определения столбцов повторяются в моем коде (например, идентификаторы).Поэтому я бы хотел перенести такие определения в базовый класс.И я написал что-то вроде этого:

public abstract class BasicEntity
{
    [Column(IsDbGenerated=true, IsPrimaryKey=true)]
    public int ID { get; set; }
}

[Table(Name = "Users")]
public class User : BasicEntity
{
    [Column(Name = "Name")]
    public string Name { get; set; }
}

public class TestDataContext : DataContext
{
    public TestDataContext(string connectionString) : base (connectionString) { }
    public Table<User> Users { get { return this.GetTable<User>(); } }
}

....

{
    TestDataContext context = new TestDataContext(validConnectionString);
    if(context.DatabaseExists())
        context.DeleteDatabase();
    context.CreateDatabase(); // an exception thrown from here
}

Итак, когда я пытаюсь создать базу данных, у меня есть System.Data.SqlClient.SqlException, которое говорит: «Столбец с именем« ID »отсутствует в целевой таблице или представлении».Ну, очевидно, это исключение вызвано моим BasicEntity.

Наконец, мой вопрос: есть ли способ унаследовать определения столбцов для удаления повторяющегося кода?

И чтобы было понятно - я использую#develop, который не имеет красивого дизайнера / генератора кода LINQ2SQL, как VS.

Заранее большое спасибо.

Ответы [ 2 ]

1 голос
/ 21 марта 2013

Я столкнулся с аналогичной ситуацией, когда работал с базой данных с 8 различными таблицами с первичным ключом и 8 ограничениями внешнего ключа.

Все 8 таблиц имели одинаковые имена столбцов и ограничения внешнего ключа, только с их полями данных и полями первичного ключа с разными именами / типами столбцов и т. Д.

Я хотел создать SQL Linq DataContext с сущностями для него, но мне не хотелось определять одинаковые 8 столбцов для каждого типа. Поэтому я поместил их в базовый тип XYZDataEntryEntity.

Я столкнулся с этой ошибкой, поэтому у меня возникла идея: я сделал все столбцы в базовом классе виртуальными. Я пометил их атрибутами Column в базовом классе, и я просто переопределил их в классах derrived, например

    public override int InstitutionID
    {
        get
        {
            return base.InstitutionID;
        }
        set
        {
            base.InstitutionID = value;
        }
    }

Затем я получил жалобы, потому что личное поле не было доступно, например,

[Column (Storage = "_XYZStatus", DbType = "Int NOT NULL =", Name = "Column_Name_here")]]

_XYZStatus не был доступен, и я подумал, да, потому что он в базовом классе.

Таким образом, я сделал _XYZStatus защищенным, а не закрытым, чтобы его мог видеть класс, и как магия. Все работало.

Конечно, мне нужно переопределить те же 8 свойств в каждом классе, чтобы они работали, но мне нужно только внести изменения в них в базовом классе, и это по крайней мере связывает их все с одним и тем же базовым классом и одинаковыми свойства.

1 голос
/ 21 марта 2011

В LINQ to SQL свойства базового класса и производного класса должны существовать в одной таблице.В вашем случае я подозреваю, что общие поля существуют в нескольких таблицах.LINQ to SQL не поддерживает этот вид отображения.Скорее всего, вам понадобится использовать EF для такого отображения наследования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...