Как управлять вставками внешних ключей в БД? - PullRequest
0 голосов
/ 03 июня 2011

Я разработал небольшой анализатор объектов (для файлов SQL, который позволяет легко находить список всех таблиц, используемых в процедуре), и у меня есть следующая модель:

3 таблицы:

  • Объект (ID, Имя, LastWriteTime)
  • Таблица (ID, имя)
  • ObjectTable (ObjectID, TableID)

У меня есть 3 соответствующих класса:

Объект - Список проверенных файлов:

[Table(Name = "object")]
public class SourceFile : IEquatable<SourceFile>
{
    public SourceFile()
    { }

    [Column(Name = "id", IsDbGenerated = true)]
    public Guid ID
    {
        get;
        set;
    }

    [Column(Name = "lastwritetime")]
    public DateTime LastWriteTimeUtc
    {
        get;
        set;
    }

    [Column(Name = "name", IsPrimaryKey = true)]
    public String Name
    {
        get;
        set;
    }

    public bool Equals(SourceFile other)
    {
        return Name == other.Name;
    }

    public override int GetHashCode()
    {
        return Name.GetHashCode();
    }
}

Таблица - Список всех таблиц в БД:

[Table(Name = "table")]
public class SourceTable : IEquatable<SourceTable>
{
    public SourceTable()
    { }

    [Column(Name = "id", IsDbGenerated = true)]
    public Guid ID
    {
        get;
        set;
    }

    [Column(Name = "name", IsPrimaryKey = true)]
    public String Name
    {
        get;
        set;
    }

    public bool Equals(SourceTable other)
    {
        return Name == other.Name;
    }

    public override int GetHashCode()
    {
        return Name.GetHashCode();
    }
}

ObjectTable - Для каждого объекта используется список таблиц:

[Table(Name = "object_table")]
public class SourceFileTable
{
    [Column(Name = "object_id", IsPrimaryKey = true)]
    public Guid ObjectID
    {
        get; set;
    }

    [Column(Name = "table_id", IsPrimaryKey = true)]
    public Guid TableID
    {
        get; set;
    }
}

Как видите, ID объекта и таблицы DBGenerated, поэтому мой вопрос: как я могу добавить значения в ObjectTable, используя сгенерированные идентификаторы? Там только один раз вставляется в БД, а не раньше.

Есть подсказка?

1 Ответ

0 голосов
/ 03 июня 2011

Если вы добавите объекты сущностей, которые вы создали, Linq-to-sql выяснит это за вас. Пока ваши внешние ключи в БД в порядке, что-то вроде этого будет работать:

using (db = new datacontext())
{ 
    var parent = new parent();
    var child = new child();
    parent.children.ad(child);
    db.parents.insertonsubmit(parent);
    db.submitchanges();
 }

То есть вы добавляете не ключи, а объекты. То же самое будет работать для такой ассоциации, как ваша.

Обновление В вашем случае это будет выглядеть (наизусть, поэтому, пожалуйста, проверьте на опечатки)

using (db = new datacontext())
{
var o = new Object();
var t = new Table();
db.objects.insertonsubmit(o);
db.tables.insertonsubmit(t);
var objecttable = new objecttable();
objecttable.object = o;
objeecttable.tbale = t;
db.objecttables.insertonsubmit(objecttable);
db.submitchanges();

}

Или у вас вопрос о том, как определить внешние ключи в базе данных? Это делается с помощью такого заявления:

ALTER TABLE ORDERS 
ADD FOREIGN KEY (customer_sid) REFERENCES CUSTOMER(SID); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...