Entity Framework, определяющий внешний ключ - PullRequest
1 голос
/ 21 августа 2011

Есть ли способ назначить внешний ключ к таблице с помощью Entity Framework? У меня есть следующая спецификация таблицы с использованием подхода «сначала база данных» (с файлом модели EDMX):

Таблица 1:

classDate   
classDate_Id(pk)
classDate_reference
classDate_start
class_Id

Таблица 2:

class_Id(pk)
class_Name
classs_description

Невозможно указать class_id в качестве внешнего ключа во время создания таблицы (classdate). Сама таблица сущностей (classdate) с class_Id в качестве столбца (обычного), а не внешнего ключа. Я хочу указать этот как внешний ключ. так что .. можно ли указывать в качестве внешнего ключа.

Это код, который я нашел в tsgentitesmodel.designer.cs. Мне нужно изменить здесь?

  public partial class tsgEntities : ObjectContext
  {
    /// <summary>
    /// No Metadata Documentation available.
    /// </summary>
    public ObjectSet<classdate> classdates
    {
        get
        {
            if ((_classdates == null))
            {
                _classdates = base.CreateObjectSet<classdate>("classdates");
            }
            return _classdates;
        }
    }
    private ObjectSet<classdate> _classdates;

    /// <summary>
    /// No Metadata Documentation available.
    /// </summary>
    public ObjectSet<@class> classes
    {
        get
        {
            if ((_classes == null))
            {
                _classes = base.CreateObjectSet<@class>("classes");
            }
            return _classes;
        }
    }
    private ObjectSet<@class> _classes;
 }

     /// <summary>
    /// Deprecated Method for adding a new object to the classdates EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
    /// </summary>
    public void AddToclassdates(classdate classdate)
    {
        base.AddObject("classdates", classdate);
    }

    /// <summary>
    /// Deprecated Method for adding a new object to the classes EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
    /// </summary>
    public void AddToclasses(@class @class)
    {
        base.AddObject("classes", @class);
    }

И я нашел следующий код, и мне нужно изменить здесь

 public partial class classdate : EntityObject
{
    #region Factory Method

    /// <summary>
    /// Create a new classdate object.
    /// </summary>
    /// <param name="classDate_End">Initial value of the classDate_End property.</param>
    /// <param name="classDate_Id">Initial value of the classDate_Id property.</param>
    /// <param name="classDate_Reference">Initial value of the classDate_Reference property.</param>
    /// <param name="classDate_Start">Initial value of the classDate_Start property.</param>
    /// <param name="class_Id">Initial value of the class_Id property.</param>
    public static classdate Createclassdate(global::System.String classDate_End, global::System.Int32 classDate_Id, global::System.String classDate_Reference, global::System.String classDate_Start, global::System.Int32 class_Id)
    {
        classdate classdate = new classdate();
        classdate.classDate_End = classDate_End;
        classdate.classDate_Id = classDate_Id;
        classdate.classDate_Reference = classDate_Reference;
        classdate.classDate_Start = classDate_Start;
        classdate.class_Id = class_Id;
        return classdate;
    }

    [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
    [DataMemberAttribute()]
    public global::System.Int32 class_Id
    {
        get
        {
            return _class_Id;
        }
        set
        {
            Onclass_IdChanging(value);
            ReportPropertyChanging("class_Id");
            _class_Id = StructuralObject.SetValidValue(value);
            ReportPropertyChanged("class_Id");
            Onclass_IdChanged();
        }
    }
    private global::System.Int32 _class_Id;
    partial void Onclass_IdChanging(global::System.Int32 value);
    partial void Onclass_IdChanged();

  // same like this for all columns in calss data table 

Ниже приведен код для объекта класса:

  /// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmEntityTypeAttribute(NamespaceName="tsgEntities", Name="class")]
[Serializable()]
[DataContractAttribute(IsReference=true)]
public partial class @class : EntityObject
{
    #region Factory Method

    /// <summary>
    /// Create a new class object.
    /// </summary>
    /// <param name="class_Description">Initial value of the class_Description property.</param>
    /// <param name="class_Id">Initial value of the class_Id property.</param>
    /// <param name="class_Name">Initial value of the class_Name property.</param>
    /// <param name="class_NumSessions">Initial value of the class_NumSessions property.</param>
    /// <param name="class_Reference">Initial value of the class_Reference property.</param>
    public static @class Createclass(global::System.String class_Description, global::System.Int32 class_Id, global::System.String class_Name, global::System.String class_NumSessions, global::System.String class_Reference)
    {
        @class @class = new @class();
        @class.class_Description = class_Description;
        @class.class_Id = class_Id;
        @class.class_Name = class_Name;
        @class.class_NumSessions = class_NumSessions;
        @class.class_Reference = class_Reference;
        return @class;
    }

    #endregion
    #region Primitive Properties

    /// <summary>
    /// No Metadata Documentation available.
    /// </summary>
    [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
    [DataMemberAttribute()]
    public global::System.String class_Description
    {
        get
        {
            return _class_Description;
        }
        set
        {
            Onclass_DescriptionChanging(value);
            ReportPropertyChanging("class_Description");
            _class_Description = StructuralObject.SetValidValue(value, false);
            ReportPropertyChanged("class_Description");
            Onclass_DescriptionChanged();
        }
    }
    private global::System.String _class_Description;
    partial void Onclass_DescriptionChanging(global::System.String value);
    partial void Onclass_DescriptionChanged();


    //same like this for all coulmns 

1 Ответ

2 голосов
/ 21 августа 2011

Если вы хотите создать взаимосвязь между Table2 и Table1 на class_Id, этот столбец должен быть первичным ключом в Table1 - или вам нужно указать UNIQUE INDEX:

CREATE UNIQUE INDEX UIX01_ClassDates ON dbo.ClassDates(class_Id)

И тогда вы сможете создать отношение внешнего ключа между вашими двумя таблицами:

ALTER TABLE dbo.Classes
ADD CONSTRAINT fk_classes_classdates
FOREIGN KEY (Class_Id) REFERENCES dbo.ClassDates(class_Id)

Теперь, как только вы это сделаете, обновите файл модели EDMX, и это отношение должночтобы появиться автоматически, сейчас!(или вы можете вручную добавить связь между двумя вашими классами, чтобы она появилась)

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