Модель MVC 3 для многих таблиц с использованием Entity Framework

Я хочу просто выбрать комбинации версий и шаблонов, которые находятся в файле db.

Вот структура БД:

CREATE Table ProductVersion(
id int not null primary key Identity,
Product_ID int not null,
Version decimal(18,1) not null,
Active bit not null,
LicenseVersion int not null,
FOREIGN KEY (Product_ID) References Products(id)
)

Create Table CodeTemplates(
id int not null primary key Identity,
Name varchar(50) not null,
DLT_ID int not null,
QuantityRule_ID int,
SerialRule_ID int,
DurationRule_ID int,
foreign key (DLT_ID) References DisplayedLicenseTypes(id),
foreign key (QuantityRule_ID) References Rulesets(id),
foreign key (SerialRule_ID) References Rulesets(id),
foreign key (DurationRule_ID) References Rulesets(id)
)

CREATE table ProductVersion_CodeTemplate(
ProductVersion_ID int not null,
CodeTemplate_ID int not null,
CONSTRAINT PK_Restrictions Primary Key Clustered
(
    ProductVersion_ID asc,
    CodeTemplate_ID asc
),
foreign key (ProductVersion_ID) References ProductVersion(id),
foreign key (CodeTemplate_ID) References CodeTemplates(id)
)

Вот текущие модели, используемые для productversion и CodeTemplates:

[Table("ProductVersion")]
public class ProductVersionModel
{
    public int ID { get; set; }
    public virtual ProductModel Product { get; set; }
    [DisplayFormat(DataFormatString = "{0:F1}",ApplyFormatInEditMode=true)]
    public decimal Version { get; set; }
    public bool Active { get; set; }
    public int LicenseVersion { get; set; }
}
[Table("CodeTemplates")]
public class TemplateModel
{
    public int ID { get; set; }

    public string Name { get; set; }
    public virtual DisplayedLicenseTypeModel DLT { get; set; }
    public virtual List<LicenseFlagModel> LicenseFlags { get; set; }
    public virtual RulesetModel QuantityRule { get; set; }
    public virtual RulesetModel SerialRule { get; set; }
    public virtual RulesetModel DurationRule { get; set; }
}

Вот что я пытался использовать:

[Table("ProductVersion_CodeTemplate")]
public class ProductVersionWithTemplateModel
{
    [Key, Column(Order = 0)]
    public virtual ProductVersionModel ProductVersion { get; set; }
    [Key, Column(Order = 1)]
    public virtual TemplateModel CodeTemplate { get; set; }
}

Первая ошибка, которая появляется:

Во время создания модели были обнаружены одна или несколько ошибок проверки:

System.Data.Edm.EdmEntityType: : EntityType 'ProductVersionWithTemplateModel' не имеет определенного ключа. Определите ключ для этого EntityType. System.Data.Edm.EdmEntitySet: EntityType: EntitySet «AppliedTemplates» основан на типе «ProductVersionWithTemplateModel», для которого не определены ключи.

Что мне здесь не хватает, привязка dbmodelbuilder?

ОТВЕТ (поскольку форматирование в комментарии ужасное):

[Table("ProductVersion_CodeTemplate")]
    public class ProductVersionWithTemplateModel
    {
        [Key, Column(Order = 0)]
        public int ProductVersion_ID { get; set; }
        [ForeignKey("ProductVersion_ID")]
        public virtual ProductVersionModel ProductVersion { get; set; }
        [Key, Column(Order = 1)]
        public int CodeTemplate_ID { get; set; }
        [ForeignKey("CodeTemplate_ID")]
        public virtual TemplateModel CodeTemplate { get; set; }
    }

person Csharpfunbag    schedule 04.09.2012    source источник


Ответы (1)


Возможно, вам следует включить такую ​​​​ссылку:

[Table("ProductVersion_CodeTemplate")]
public class ProductVersionWithTemplateModel
{
 [Key, Column(Order = 0)]
 public int ProductVersionModelId { get; set; }
 [ForeignKey("ProductVersionModelId")]
 public virtual ProductVersionModel ProductVersion { get; set; }
 [Key, Column(Order = 1)]
 public int TemplateModelId { get; set; }
 [ForeignKey("TemplateModelId")]
 public virtual TemplateModel CodeTemplate { get; set; }
}
person Travis J    schedule 04.09.2012
comment
Я пробовал почти то же самое, но у меня не было атрибута внешнего ключа, примененного к виртуальному типу. Любая идея или статья, которая помогла бы мне понять, почему я должен предоставлять поля int в этой модели, когда они существуют в виртуальных свойствах? Большое спасибо за ответ! - person Csharpfunbag; 05.09.2012
comment
Почти идеальный ответ, за исключением того, что у меня были некоторые проблемы с внешним ключом, не совпадающим с фактическим полем идентификатора в БД. Я предоставил более приятный формат в своем исходном сообщении для ответа. Еще раз спасибо за ответ TravisJ! - person Csharpfunbag; 05.09.2012