我之前从未使用过实体框架,我想尝试一些实现它的个人项目来让我的脚湿透。
我看到实体可以暴露给表示层。 但我不希望暴露某些字段,修改日期和创建日期等字段以及各种其他数据库字段。
我如何实现Business对象并公开我需要的属性但仍保持对象可序列化?
这对LinqToSql有什么优势?
答案 0 :(得分:22)
在EDMX模型中定义实体时,可以指定每个属性的setter和getter的可见性,因此如果您不希望ModifiedDate在其他层中可见,则可以将其指定为内部。
如果您的需求更复杂,例如ModifiedDate应该可以在实体程序集和业务逻辑程序集中访问,但不能在UI程序集中访问,那么您需要创建另一个将在业务逻辑和UI逻辑之间交换的对象层。
答案 1 :(得分:7)
答案 2 :(得分:3)
亲自在实体上使用包装类并公开或隐藏我需要的内容。
// instead of below property in your BLL:
private int m_someVariable;
public int SomeVariable
{
get { return m_someVariable; }
set { m_someVariable = value; }
}
// You can use the entity object:
private readonly EntityClass _entityObject = new EntityClass();
public int SomeVariable
{
get { return _entityObject.SomeVariable; }
set { _entityObject.SomeVariable = value; }
}
// or make it read-only at your BLL
public int SomeVariable
{
get { return entityObject.SomeVariable; }
// set { entityObject.SomeVariable = value; }
}
答案 3 :(得分:1)
您只需将所需的属性绑定到表示层,这可以通过声明,业务逻辑层(具有自己的对象抽象级别)或ViewModel来完成。
答案 4 :(得分:1)
// this is your edmx
Asset5Entities conx = new Asset5Entities();
//认为这是Contact的新对象列表,它是数据库中的一个表 //使用实体框架将此数据库表映射到一个对象以供您处理
List$gt;Contact$lt; s = new List$gt;Contact$lt;();
//使用大量的LINQ你现在可以选择或查询你的数据库中的任何表,你有 //访问该表示例(电子邮件)中的列
var result = from q in conx.Contacts select q.Email;
//而不是
string sqlcommand = "select email from Contacts";
Contact con = new Contact();
con.Email= "xxxx@gmail.com";
con.FirstName="nader";
//etc etc...
conx.Contacts.AddObject(con);
//rather than " insert into Contact values ......................"
//having your queries within ur c# code rather than strings that are not parsed //for errors but on runtime was alot helpful for me