#c_sharp #sql #entity_framework
С C# занимаюсь относительно недавно. С простыми классами (моделями) более менее понятно. Стоит задача организовать модели и логику по следующим таблицам: Nomenclature: CREATE TABLE [dbo].[Nomenclature]( [Id] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](250) NOT NULL, [InvNo] [int] NOT NULL, [InvBuh] [nvarchar](25) NOT NULL, [Model] [nvarchar](250) NULL, [TypeN] [int] NOT NULL, [MOL] [int] NULL, [TH] [int] NULL, CONSTRAINT [PK_dbo.Nomenclature] PRIMARY KEY CLUSTERED Как реализовать в классах различный набор полей (которые хранятся в других таблицах в виде списка полей и списка их значений) у сущности (модели) Nomenclature в зависимости от двух полей [TypeN], [TH]. Т.е. для каждого варианта [TypeN]+[TH] у Nomenclature должны быть свои поля в дополнении к общим перечисленным в указанной таблице. Уже голову сломал, не могу сообразить как это реализовать. Перерыл весь интернет, но подробного примера нигде не нашел. Наследование не подойдет, так как список дополнительных полей может меняться. Нужно динамическое создание полей у сущности. База SQL+EF+ADO.NET+Code First Никто с таким не сталкивался?
Ответы
Ответ 1
Вариант 1. Используйте подход EAV (Entity-Attribute-Value) Будет как-то так: public class Entity { public long Id {get; set;} public virtual CollectionValues {get; set;} } public class Attribute { public long Id {get; set;} public string Name {get;set;} } public class Value { [Key, Column(Order=0)] public long EntityId {get; set;} [Key, Column(Order=1)] public long AttributeId {get; set;} public virtual Attribute Attribute {get; set;} public virtual Entity Entity {get; set;} public object Value {get; set;} } Ну и в БД соответственно - три таблицы. Вариант 2. Выкиньте из вашей связки EF и используйте простой ADO.NET. Такие классы, как DataRow и DataTable, прекрасно умеют хранить произвольное число столбцов. Дополнение Если поля очень-очень динамические, есть смысл использовать NoSQL-базы. Или просто храните в базе xml либо json.
Комментариев нет:
Отправить комментарий