Я вижу два подхода: ни один из которых я бы не назвал совершенным, но, возможно, это поможет или поможет улучшить идею:
1) Измените базу данных, чтобы иметь таблицу ресурсов, чтобы ResourceA, Bи C может иметь отношение внешнего ключа.Каждый из ваших классов будет выглядеть следующим образом:
public partial class ResourceA
{
public Resource Resource {get; set;}
public string Path { get; set; }
}
, и у вас будет таблица, которую EF создаст следующим образом:
public partial class Resource
{
public int ID {get; set;}
public long ProductId { get; set; }
}
Другой вариант: будучи частичными классами, вы можете расширять классы.и реализуем их с помощью интерфейса:
Быстрое и немного грязное доказательство концепции:
public interface IResources
{
Resource GetResource();
}
public partial class ResourceA : IResources
{
public Resource GetResource()
{
return new Resource()
{
ID = ID,
ProductID = ProductID
};
}
}
public partial class ResourceB : IResources
{
public Resource GetResource()
{
return new Resource()
{
ID = ID,
ProductID = ProductID
};
}
}
public partial class ResourceC : IResources
{
public Resource GetResource()
{
return new Resource()
{
ID = ID,
ProductID = ProductID
};
}
}
public class Resource
{
public int ID { get; set; }
public long ProductID { get; set; }
}
//These are the "generated" EF partials
public partial class ResourceA
{
public int ID { get; set; }
public long ProductID { get; set; }
public string Path { get; set; }
}
public partial class ResourceB
{
public int ID { get; set; }
public long ProductID { get; set; }
public string Label { get; set; }
}
public partial class ResourceC
{
public int ID { get; set; }
public long ProductID { get; set; }
public bool Open { get; set; }
public bool Replacement { get; set; }
}
Это на самом деле не для меня в базе данных, поэтому я просто издевался над ней в консолиapplication:
var A = new ResourceA()
{
ID = 15,
Path = @"C:\Path",
ProductID = 15001
};
var B = new ResourceB()
{
ID = 16,
ProductID = 166101,
Label = "Ham"
};
var C = new ResourceC()
{
ID = 188,
Open = true,
ProductID = 900014,
Replacement = false,
};
List<IResources> resources = new List<IResources>();
resources.Add(A);
resources.Add(B);
resources.Add(C);
foreach(var r in resources)
{
Console.WriteLine(r.GetResource().ID);
}
Это работает, но я бы сказал, что это, вероятно, не идеально.Я бы поместил интерфейс и дополнительные классы в отдельный файл на уровне доступа к данным, чтобы EF не перезаписывал их тоже.